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

Posted

技术标签:

【中文标题】用于捕获嵌套括号中的值的正则表达式【英文标题】:RegEx for capturing values in nested brackets 【发布时间】:2019-10-11 21:12:18 【问题描述】:

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

我尝试将 [A-z]* 而不是 .* 用于仅匹配内部文本并且它有效。但我也需要匹配非字母字符。

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

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

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

粗体字符是匹配的。

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

【问题讨论】:

将捕获设置为非贪婪 (.+?) 或使用 ([^\]]+) 还要注意[A-z] 将consume square brackets。 你能添加示例输入和输出吗? @DenisGiffeler 是的,它有效!我可以设置 U 标志或 ?。将您的评论作为答案,我会标记它 【参考方案1】:

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

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

Demo

【讨论】:

我也需要捕捉像空格这样的字符。只捕获字母 我的意思是我必须捕获括号之间的每个字符...抱歉,如果我不太清楚【参考方案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))
);

【讨论】:

【参考方案3】:

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

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

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

(.+?)

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

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

演示

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

正则表达式

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

正则表达式电路

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

【讨论】:

【参考方案4】:

正则表达式

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

(?&lt;=\\[):以括号开头,但不包含括号。

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

详细解释可以在这个link找到。

【讨论】:

【参考方案5】:

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

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

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

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

说明

\[匹配[ (开始抓包 [^\][\n-]+ 否定字符类,匹配 1 次以上而不是 ][- 或换行符 -匹配- [^\][\n-]+ 匹配 1+ 次而不是 ][- 或换行符 )关闭捕获组 ]匹配]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]);

【讨论】:

以上是关于用于捕获嵌套括号中的值的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式中 如何取出所有组中的值?

用于匹配嵌套括号内的特定文本的 C# 正则表达式

用于匹配大括号中的每一行的正则表达式

python中的正则表达式嵌套括号

用于处理带有周围字符的值的正则表达式?

c# 正则表达式提取()中的值