如何捕获所有内容,直到另一个捕获组

时间:2019-06-03 06:30:40

标签: 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 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  

我想有3个群组:

1251  

Left  

Random Text I want to fill  
It can go through multiple lines  
As you can see  

我正在使用

(\d+)\s(\w+)\s(.*)  

,但它仅在当前行停止(因此,我希望在第3组中仅获得Random Text I want to fill,尽管我想包括As you can see
如果我使用“单行”标志,则每个组只有1个匹配项,第3组几乎全是

这里是直播:https://regex101.com/r/W3x0mH/4

4 个答案:

答案 0 :(得分:3)

您可以使用重复的组来匹配所有行,同时断言下一行不会以1+数字开头,后跟Left或Right:

(\d+)\s(\w+)\s(.*(?:\r?\n(?!\d).*)*)

说明

  • (\d+)\s(\w+)\s匹配前2组
  • (第三捕获小组
    • .*匹配除换行符以外的任意字符0+次
    • (?:非捕获组 \r?\n(?!\d).*匹配换行符,断言右边的不是数字
    • )*关闭非捕获组并重复0次以上
  • )关闭捕获组

Regex demo

答案 1 :(得分:2)

您可以提前使用此正则表达式:

^(\d+)\s(\w+)\s(.*?)(?=\n\d|\z)

具有DOTALL和MULTILINE修饰符。

Updated Regex Demo

RegEx详细信息:

  • ^:行开始
  • (\d+):匹配并捕获第1组中的1个以上数字
  • \s:匹配空格
  • (\w+):匹配并捕获#2组中的1个以上单词字符
  • \s:匹配空格
  • (.*?):如果满足下一个超前断言的要求,则匹配0个或多个任意字符(非贪婪)
  • (?=\n\d|\z):先行断言,断言我们有换行符,后跟数字或输入结尾

快速正则表达式:

如果在长字符串上使用此正则表达式,则还应牢记总体性能,因为带有DOTALL修饰符的正则表达式在大尺寸文本上会变慢。为此,我建议使用不需要DOTALL修饰符的正则表达式:

^(\d+)\s(\w+)\s(.*(?:\n.*)*?)(?=\n\d|\z)

RegEx Demo 2

在regex101演示中,此regex仅需要 181个步骤,而第一个正则需要 1300个步骤

答案 2 :(得分:1)

对于第三组,在对^\d使用否定超前查询的同时重复任何字符,这将表明新比赛的开始:

(\d+)\s(\w+)\s((?:(?!^\d)[\s\S])*)

https://regex101.com/r/W3x0mH/5

答案 3 :(得分:0)

您可以尝试使用此正则表达式:

^(\d+)\s+(\w+)\s+(.*?)(?=^\d|\z)
  1. ^(\d+)\s+^\d+行以数字开头,后跟一个或多个空白字符\s+
  2. (\w+)\s+,其中\w+一个或多个字符(左,右,na或其他),后跟一个或多个空格\w+
  3. (.*?)匹配所有内容,直到找到以数字开头或\z字符串结尾的行。

我认为它符合您的要求。...

Regex101