Regex 如何在另一个捕获组之前捕获所有内容
我有以下模板:Regex 如何在另一个捕获组之前捕获所有内容,regex,Regex,我有以下模板: 1251 Left Random Text I want to fill It can go through multiple lines As you can see 9841 Right Again we see a lot of random text with 3115 numbers And this also goes To multiple lines 0121 Right 5151 Right This one is just on
1251 Left Random Text I want to fill
It can go through multiple lines
As you can see
9841 Right Again we see a lot of random text with 3115 numbers
And this also goes
To multiple lines
0121 Right
5151 Right This one is just one line
I was wrong
9731 Left This one is just a line
5123 NA Instruction 5151 was wrong
4113 Right Instr 9841 was correct
We checked
我想分为三组:
1251
Left
Random Text I want to fill
It can go through multiple lines
As you can see
我正在使用
(\d+)\s(\w+)\s(.*)
但是它只在当前行停止(因此我只得到我想在第3组中填充的随机文本,尽管我想包括,正如你所看到的)
如果我使用单行标志,每组只能得到一个匹配项,第三组几乎是全部
这里是live:对于第三组,在对^\d
使用负前瞻时重复任何字符,这将指示新匹配的开始:
(\d+)\s(\w+)\s((?:(?!^\d)[\s\S])*)
您可以使用此正则表达式进行前瞻:
^(\d+)\s(\w+)\s(.*?)(?=\n\d|\z)
使用点调用和多行修改器
正则表达式详细信息:
^
:行开始
(\d+)
:匹配并捕获组#1中的1+个数字
\s
:匹配空白
(\w+)
:在第2组中匹配并捕获1+个单词字符
\s
:匹配空白
(.*)
:如果满足下一个先行断言,则匹配任何字符的0个或多个(非贪婪)
(?=\n\d |\z)
:前瞻性断言,用于断言我们有一个紧跟数字的换行符或输入结束
更快的正则表达式:
如果您在长字符串上使用此正则表达式,则还应记住总体性能,因为带有DOTALL
修饰符的正则表达式在大文本上的速度会变慢。为此,我建议使用不需要DOTALL修饰符的正则表达式:
^(\d+)\s(\w+)\s(.*(?:\n.*)*?)(?=\n\d|\z)
在regex101演示中,与第一个需要1300
步数的正则表达式相比,此正则表达式只需181步数
,您可以使用一个重复组匹配所有行,同时声明下一行不是以1+位数字开头,后跟左或右:
(\d+)\s(\w+)\s(.*(?:\r?\n(?!\d).*)*)
解释
(\d+)\s(\w+)\s
匹配前两组
(
第三捕获组
*
匹配0+乘以除换行符以外的任何字符
(?:
非捕获组
\r?\n(?!\d)。*
匹配换行符,断言右边的不是数字
)*
关闭非捕获组并重复0多次
)
关闭捕获组
您可以尝试使用此正则表达式:
^(\d+)\s+(\w+)\s+(.*?)(?=^\d|\z)
^(\d+)\s+
,^\d+
行以数字开头,后跟一个或多个空格字符\s+
(\w+\s+
其中\w+
一个或多个字符(左、右、na或其他字符)后跟一个或多个空格\w+
(.*)
匹配所有内容,直到找到以数字或\z
字符串结尾开头的行
我认为它符合你的要求
逻辑:数字后接右或左,第三组继续,直到您得到数字和右或左?解释这些行:a)9841行再次向右,我们看到很多行b)带有3115个数字的随机文本,这也指向多行c)0121行右行d)5151行右这只是一行它可以是右行或左行或其他@RizwanM.Tuman。你想解释什么?我并不总是确定是左/右,它也可以是另一个词:NA,正如你在示例中看到的那样。还有,可能还有其他的。@Razvan是为你工作的吗?这是我会使用的一个表达式,尽管(?!\d+
中的量词是多余的。此外,由于我们不知道正则表达式的风格,\r?
对于那些
与回车符号不匹配的正则表达式引擎,在\n
之前可能需要使用\r?
。当然,如果支持\R
构造,则应该使用它而不是\n
@WiktorStribiż如果您是对的,谢谢您的评论!。我已经更新了。