c# - 正则表达式提取多个句子,同时丢弃特定句子

标签 c# regex

在: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/

相关文章:

c# - 没有尾部斜杠的链接

java - 使用 Java 正则表达式在字符串中间查找匹配的字符串

javascript - 如何检查相邻字符是什么?

javascript - 正则表达式匹配模式以 ':' 结尾但不包含它

python - 用 Pandas DataFrame 中出现频率最高的单词替换单元格

java - 使用@Pattern时显示属性文件消息?

c# - 查询本地管理员组

c# - NAudio 不播放 RawSourceWaveStream

c# - 要求表单例份验证

c# - 如何在 C# 中将参数传递给 Windows 服务?