我有以下模板:
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组几乎全是
答案 0 :(得分:3)
您可以使用重复的组来匹配所有行,同时断言下一行不会以1+数字开头,后跟Left或Right:
(\d+)\s(\w+)\s(.*(?:\r?\n(?!\d).*)*)
说明
(\d+)\s(\w+)\s
匹配前2组(
第三捕获小组
.*
匹配除换行符以外的任意字符0+次(?:
非捕获组
\r?\n(?!\d).*
匹配换行符,断言右边的不是数字)*
关闭非捕获组并重复0次以上)
关闭捕获组答案 1 :(得分:2)
您可以提前使用此正则表达式:
^(\d+)\s(\w+)\s(.*?)(?=\n\d|\z)
具有DOTALL和MULTILINE修饰符。
RegEx详细信息:
^
:行开始(\d+)
:匹配并捕获第1组中的1个以上数字\s
:匹配空格(\w+)
:匹配并捕获#2组中的1个以上单词字符\s
:匹配空格(.*?)
:如果满足下一个超前断言的要求,则匹配0个或多个任意字符(非贪婪)(?=\n\d|\z)
:先行断言,断言我们有换行符,后跟数字或输入结尾快速正则表达式:
如果在长字符串上使用此正则表达式,则还应牢记总体性能,因为带有DOTALL
修饰符的正则表达式在大尺寸文本上会变慢。为此,我建议使用不需要DOTALL修饰符的正则表达式:
^(\d+)\s(\w+)\s(.*(?:\n.*)*?)(?=\n\d|\z)
在regex101演示中,此regex仅需要 181
个步骤,而第一个正则需要 1300
个步骤。
答案 2 :(得分:1)
对于第三组,在对^\d
使用否定超前查询的同时重复任何字符,这将表明新比赛的开始:
(\d+)\s(\w+)\s((?:(?!^\d)[\s\S])*)
答案 3 :(得分:0)
您可以尝试使用此正则表达式:
^(\d+)\s+(\w+)\s+(.*?)(?=^\d|\z)
^(\d+)\s+
,^\d+
行以数字开头,后跟一个或多个空白字符\s+
(\w+)\s+
,其中\w+
一个或多个字符(左,右,na或其他),后跟一个或多个空格\w+
(.*?)
匹配所有内容,直到找到以数字开头或\z
字符串结尾的行。我认为它符合您的要求。...