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

问题描述 投票:0回答:2

我是正则表达式的新手,可以使用一些帮助。每个块由两个新的行字符\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不是最后一个时,我需要它停止,以防止它在其他块中找到模式。

regex
2个回答
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(并注意修饰符!)。


An alternative solution would be to split on empty lines (^$ with the multiline flag set) and check for (medium) in the resulting blocks.

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)描述.+之前的每个最终行,该qazxswpoi强制执行至少一个字符(换句话说,它不是空白行)。

© www.soinside.com 2019 - 2024. All rights reserved.