我是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
而不是最后一次时停止,以防止它在其他块中找到模式。
答案 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)
来描述.+
之前的每个最终行,这些行强制执行至少一个字符(换句话说,它不是空行)。