用于捕获嵌套括号中的值的正则表达式
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]+)(?=\])
(?<=\\[)
:以括号开头,但不包含括号。
(?=\\])
:以括号结尾,但不包含括号。
详细解释可以在这个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]);
【讨论】:
以上是关于用于捕获嵌套括号中的值的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章