有这样的文字(多行)
1. sdfsdf werwe werwemax45 rwrwerwr
2. 34348878 max max44444445666 sdf
3. 4353424 23423eedf max55 dfdg dfgdf
4. max45
5. 4324234234sdfsdf maxx34534
使用正则表达式我需要查找所有行,并在匹配的组中包含单词max<digits>
(包含数字而不是字面<digits>
)。
所以我试过这个正则表达式:
^.*?\b(max\d+)\b.*?$
但它只找到包含max...
的行并忽略其他行。
然后我试过
^.*?\b(max\d+)?\b.*?$
它找到所有行但没有包含max...
的匹配组。
答案 0 :(得分:3)
问题可以通过&#34;调试&#34;稍微修改一下模式^(.*?)\b(max\d+)?\b(.*?)$
,其余模式包含在不同的捕获组中。您可以看到这些行都与第3组模式匹配,即最后一个.*?
。这是因为第一个.*?
被跳过(因为它是一个懒惰的模式),然后(max\d=)?
匹配行开头的空字符串(没有以max
+数字开头 - 但是如果任何行以该模式开始,you would get it captured),则最后一个.*?
捕获整行。
您可以通过将第一部分包装到非捕获的可选组中来修复它,将max\d+
捕获到强制性捕获组
^(?:.*?\b(max\d+)\b)?.*?$
即使最后没有?$
,因为.*
会贪婪地匹配到行尾:
^(?:.*?\b(max\d+)\b)?.*
请参阅regex demo
<强>详情
^
- 字符串开头(m
选项,行首)(?:.*?\b(max\d+)\b)?
- 可选的非捕获组:
.*?
- 除了尽可能少的换行符之外的任何0+字符\b
- 字边界(max\d+)
- 第1组(必填,将尝试一次):max
和1+位数\b
- 字边界.*
- 其余部分