使用正则表达式查找所有行

时间:2017-10-18 07:51:47

标签: regex

有这样的文字(多行)

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...的匹配组。

1 个答案:

答案 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 - 字边界
  • .* - 其余部分
相关问题