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

Posted

技术标签:

【中文标题】用于匹配大括号中的每一行的正则表达式【英文标题】:Regex for matching every line enclosed in curly brackets 【发布时间】:2020-07-07 16:30:39 【问题描述】:

我正在尝试匹配大括号内的每一行,并且我正在努力捕捉我想要的内容。举个例子,如果我有这样的文字:

这是一条线, 这 = 另一行, 这是第三行! 这确实是另一条线 , 第二轮: 我们现在在第二对括号上, 这是最后一行。

那我要匹配捕获一共六行:

this is a line, this = another line, this is the third line! this is, indeed, another line we're now on the second pair of brackets, and this is the final line.

到目前为止,我目前的想法是尝试匹配“花括号”->“任何东西”->“行”->“任何东西”->“花括号”,即类似这样的东西:

(?s)[^]*(^([^^\n]+)$)(?s)[^]*

但这只匹配每对花括号中的一行,而不是 每一行

我该怎么做呢?谢谢。


编辑:更新了示例以在一个左大括号和不同的空格之前包含前面的文本。

【问题讨论】:

@WiktorStribiżew 编辑了我的帖子以展示我到目前为止所获得的信息。 您是否尝试过不匹配大括号? [^\\]+ @Dunois 这将匹配大括号中的全部内容,而不是一次只匹配一行。 输入格式是否正确?即,有没有前面没有 您的文件最初是 JSON 文档吗?它看起来有点像一个对象数组。如果是这样,最好使用 JSON 解析器来选择这些项目。 【参考方案1】:

只匹配不包含大括号的行:

^[^\r\n]+$

要设置多行标志 (/m)。或者,在正则表达式的开头插入 (?m)

Demo

正则表达式为“匹配行首,后跟除\r\n 之外的一个或多个字符,然后是行尾”。

要排除每个匹配行中的前导空格,您可以稍微修改正则表达式:

^\s*\K[^\r\n]+$

Demo

\K 重置匹配的起点,不包括任何先前使用的字符。 \K 不适用于所有正则表达式引擎。

【讨论】:

效果很好。谢谢! @Step 如果你真的需要匹配不包含大括号的行,你需要(?m)^[^\r\n]+$ @Wiktor,谢谢。好多了。我会做出改变。【参考方案2】:

假设输入格式正确:

([^\n](?=[^]+))+

见live demo

【讨论】:

这似乎与左大括号匹配,并且对于大括号之前的文本也不可靠:regex101.com/r/fvFF5Z/2 这与左大括号不再匹配,但对于左大括号之前的文本仍然不可靠。 @step 好的,现在排序。见演示链接。

以上是关于用于匹配大括号中的每一行的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

java的正则表达

正则表达式如何匹配提取括号中的内容

如何用正则表达式匹配括号中的内容,不包含括号

如何用正则表达式匹配括号中的内容。

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

正则表达式在非常大的html文件中匹配java中的花括号[重复]