简体   繁体   中英

RegEx for capturing values in nested brackets

I was trying to use a regular expression to match the inner text between two characters, but I am getting the wrong text

I tried putting [Az]* instead of .* for matching only the inner text and it worked. But I need to match non-letter characters too.

/\[?(,? ?\[(\[(.+)-(.+)\])\])\]?/g

This is my regular expression and i want to match the characters between the square brackets:

[[[ hello-hello]],[[hi -hi]]]

The bold characters are the one matched.

I'd expect to match [[[ hello-hello ]],[[hi-hi]]] in match 1 and [[[hello-hello]],[[ hi-hi ]]] in match two.

Here is the regex I came up with:

\[+([a-z- A-Z]+)\]+

Demo

I'd use something like this:

\[(?!\[)([^\]]*)\]

This will match a [ character, if not followed by a [ character. It will then match any amount of non ] characters capturing them in group 1. Followed by matching a ] character.

 const text = "[[[hello-hello]],[[hi-hi]]]"; const regex = /\\[(?!\\[)([^\\]]*)\\]/g; var match; while (match = regex.exec(text)) { console.log(match); } 

Alternatively you can leave out the capturing group and drop the first and last character of every match.

 const text = "[[[hello-hello]],[[hi-hi]]]"; const regex = /\\[(?!\\[)[^\\]]*\\]/g; console.log( text.match(regex) .map(match => match.slice(1, -1)) ); 

If everything in between the [] would be desired, then we might simplify our expression to maybe:

(?:\[+)(.+?)(?:\]+)

Here, we capture our likely desired substring in this capturing group:

(.+?)

Then, we add two boundaries on its left and right sides using two non-capturing groups:

(?:\[+)
(?:\]+)

Demo

 const regex = /(?:\\[+)(.+?)(?:\\]+)/g; const str = `[[[hello-hello]] [[hi-hi]]] [[hi hi]]]`; const subst = `$1`; // The substituted value will be contained in the result variable const result = str.replace(regex, subst); console.log('Substitution result: ', result); 

在此输入图像描述

RegEx

If this expression wasn't desired, it can be modified/changed in regex101.com .

RegEx Circuit

jex.im visualizes regular expressions:

在此输入图像描述

You could use 1 capturing group to capture your values.

The values before and after the hyphen could be matches using a negated character class \\[([^][\\n-]+ matching not an opening or closing bracket, a hyphen or a newline.

In your pattern you use a dot which will match any character except a newline so the negated character class contains a newline to prevent crossing lines.

\[([^\][\n-]+-[^\][\n-]+)]

Explanation

  • \\[ Match [
  • ( Start capturing group
    • [^\\][\\n-]+ Negated character class, match 1+ times not ] , [ , - or a newline
    • - Match -
    • [^\\][\\n-]+ Match 1+ times not ] , [ , - or a newline
  • ) Close capturing group
  • ] Match ] char

Regex demo

 const regex = /\\[([^\\][\\n-]+-[^\\][\\n-]+)]/g; const str = `[[[hello-hello]],[[hi-hi]]]`; let m; while ((m = regex.exec(str)) !== null) { if (m.index === regex.lastIndex) { regex.lastIndex++; } console.log(m[1]); } 

RegEx

(?<=\[)([a-z- A-Z]+)(?=\])

(?<=\\\\[) : Start with a bracket, but does not contain a bracket.

(?=\\\\]) : End with a bracket, but does not contain a bracket.

Detailed explanations can be found in this link .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM