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ż如果您是对的,谢谢您的评论!。我已经更新了。