在:preferences = 'Hello my name is paul. I hate puzzles.'
我要提取Hello my name is paul.
在:preferences = 'Salutations my name is richard. I love pizza. I hate rain.'
我要提取Salutations my name is richard. I love pizza.
在:preferences = 'Hi my name is bob. I enjoy ice cream.'
我要提取Hi my name is bob. I enjoy ice cream.
换句话说,我想
- 始终丢弃
preferences = '
- 丢弃包含单词
.
的任何最后句子(由hate
分隔)在,如果存在。 - 放弃最后的
'
我的问题是我的正则表达式停在第一个 .
并且不提取后续句子。
谢谢。
最佳答案
您可以使用正则表达式实现您想要的目的:
^preferences\s*=\s*'(.*?\.)(?:[^.]*\bhate\b[^.]*\.)?'$
这个并不太棘手:
(.*?\.)
- 匹配您的预期输出,该输出将在组$1
中捕获。该模式匹配“句子”(如您所定义的),但是是惰性的(*?
),尽可能少。(?:[^.]*\bhate\b[^.]*\.)?
- 可选地匹配最后一个句子,但前提是它包含“hate”。如果能匹配到,并且是最后一句,则匹配引擎不会回溯,最后一句不会包含在捕获组中。
这是 Rubular 中的一个工作示例:http://www.rubular.com/r/qTuMmB3ySj
(我在几个地方添加了 \r\n
,以避免 [^.]
匹配新行)
老实说,如果你能避免的话,你可以比使用单个正则表达式做得更好。
关于c# - 正则表达式提取多个句子,同时丢弃特定句子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10058060/