正则表达式,用于捕获嵌套括号中的值

时间:2019-05-25 16:21:52

标签: javascript regex regex-lookarounds regex-group regex-greedy

我试图使用正则表达式来匹配两个字符之间的内部文本,但是我得到了错误的文本

我尝试用[A-z] *代替。*来仅匹配内部文本,并且可以正常工作。但是我也需要匹配非字母字符。

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

这是我的正则表达式,我想匹配方括号之间的字符:

  

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

粗体字符是匹配的一个。

  

我希望在比赛1中匹配[[[ hello-hello ]],[[hi-hi]]],   在第二场比赛中[[[hello-hello]],[[ hi-hi ]]]。

5 个答案:

答案 0 :(得分:2)

这是我想出的正则表达式:

a-z

Demo

答案 1 :(得分:2)

我会用这样的东西:

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

这将匹配一个[字符,如果没有后跟一个[字符。然后,它将匹配在第1组中捕获它们的任意数量的非]字符。然后匹配一个]字符。

const text = "[[[hello-hello]],[[hi-hi]]]";
const regex = /\[(?!\[)([^\]]*)\]/g;
var match;

while (match = regex.exec(text)) {
  console.log(match);
}

或者,您可以省略捕获组并删除每个匹配项的第一个和最后一个字符。

const text = "[[[hello-hello]],[[hi-hi]]]";
const regex = /\[(?!\[)[^\]]*\]/g;

console.log(
  text.match(regex)
      .map(match => match.slice(1, -1))
);

答案 2 :(得分:2)

如果需要[]之间的所有内容,那么我们可以将表达式简化为:

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

在这里,我们在此捕获组中捕获了我们可能想要的子字符串:

(.+?)

然后,我们使用两个非捕获组在其左侧和右侧添加两个边界:

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

演示

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);

enter image description here

RegEx

如果不需要此表达式,可以在regex101.com中对其进行修改/更改。

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 3 :(得分:2)

您可以使用1个捕获组来捕获您的值。

可以使用negated character class \[([^][\n-]+匹配连字符前后的值,而不匹配左括号或右括号,连字符或换行符。

在模式中,您使用的点将匹配除换行符以外的任何字符,因此,否定的字符类包含换行符以防止交叉线。

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

说明

  • \[匹配[
  • (开始捕获组
    • [^\][\n-]+否定的字符类,匹配1次以上而不是][-或换行符
    • -匹配-
    • [^\][\n-]+匹配1次以上,而不是][-或换行符
  • )关闭捕获组
  • ]匹配]字符

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]);
}

答案 4 :(得分:1)

RegEx

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

(?<=\\[):以方括号开头,但不包含方括号。

(?=\\]):以方括号结尾,但不包含方括号。

详细说明可以在此link中找到。