正则表达式在\ n \ n之间找不到匹配项

时间:2017-12-19 20:15:46

标签: regex

我是regex的新手,可以使用一些帮助。每个块由两个新行字符\n\n分隔。我需要得到狗的数量,但只有当该块含有中等大小的狗

我有字符串

"4211 dogs ate 2 pounds
    chris (large)

3454 dogs ate 8 pounds
    john (medium)
    alex (small)

4211 dogs ate 2 pounds
    morgan (small)
"
//regex \d+(?=\sdogs\sate\s\d+\spounds[\s\S]*(?!\n\n)\(medium\))

使用这个正则表达式:
\d+(?=\sdogs\sate\s\d+\spounds[\s\S]*(?!\n\n)\(medium\))
差不多了。但问题在于,当它找到模式\n\n时,它不会停止,直到找到\n\n的最后一次出现。我需要它在发现第一次出现\n\n而不是最后一次时停止,以防止它在其他块中找到模式。

2 个答案:

答案 0 :(得分:1)

您可以使用

^                 # match the start of the line in multiline mode
(?P<amount>\d+)   # capture the number of dogs
(?:(?!^$)[\s\S])+ # do not overrun an empty line, matching every character
\(medium\)        # look for (medium)

请参阅a demo on regex101.com(并注意修饰符!)。

<小时/> 另一种解决方案是拆分空行(^$并设置multiline标志)并在结果块中检查(medium)

答案 1 :(得分:1)

带有捕获组的PCRE:

(?m)^(\d+) dogs ate \d+ pounds\n(?>.+\n)*?.*\(medium\)

(?m)^\d+(?= dogs ate \d+ pounds\n(?>.+\n)*?.*\(medium\))

带捕获组的Javascript / Python:

(?m)^(\d+) dogs ate \d+ pounds\n(?:.+\n)*?.*\(medium\)

(?m)^\d+(?= dogs ate \d+ pounds\n(?:.+\n)*?.*\(medium\))

具有这些模式的关键是使用(medium)来描述.+之前的每个最终行,这些行强制执行至少一个字符(换句话说,它不是空行)。