我是正则表达式的新手,可以使用一些帮助。每个块由两个新的行字符\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
不是最后一个时,我需要它停止,以防止它在其他块中找到模式。
你可以用
^ # 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(并注意修饰符!)。
^$
with the multiline
flag set) and check for (medium)
in the resulting blocks.
具有捕获组的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)
描述.+
之前的每个最终行,该qazxswpoi强制执行至少一个字符(换句话说,它不是空白行)。