【问题标题】:How to remove lines that do NOT end with a particular sequence with regex如何使用正则表达式删除不以特定序列结尾的行
【发布时间】:2014-10-10 09:24:37
【问题描述】:

我想使用正则表达式来查找字典文件中以特定字符序列结尾的所有单词。我目前使用以下正则表达式

.*charsequence$

很好地匹配我的字典中以我的字符序列结尾的所有条目。

但是现在我实际上想反转这个正则表达式以匹配所有不以我的字符序列结尾的行,所以我可以用空字符串替换它们,并最终得到一个以我的字符序列结尾的字典条目的漂亮列表。我尝试使用以下正则表达式否定字符序列部分:

.*[^(charsequence)]$

结果列表似乎包含所有以我的字符序列结尾的原始条目,但它仍然包含一些不以我的字符序列结尾的条目。

注意:stackoverflow 上有很多类似的问题,但我找不到一个完全涵盖我的特殊情况的问题。大多数类似的问题似乎要么侧重于删除不以特定序列开头的行,要么侧重于删除不以特定字符结尾的行(与字符序列相反)。

任何帮助将不胜感激!

【问题讨论】:

  • 如果你使用 grep,-v 标志会反转结果,所以如果你有一个匹配你不想要的行的正则表达式,那么你可以反转它。

标签: regex regex-negation


【解决方案1】:

只需使用负前瞻来匹配除以charsequence 结尾的所有行

^(?!.*charsequence$).*$

DEMO

【讨论】:

  • 匹配是因为字符串charsequence不在末尾。
  • 我认为在这种情况下,贪婪的.* 可能会稍微快一些,因为它不必在行尾检查字符序列。 (它只检查行终止符)。
  • @nhahtdh 不,调试器将上述正则表达式显示为更快的正则表达式。我想是因为回溯。 .* 会先匹配到最后,然后回溯到匹配。
  • 不过,对实际性能不太确定。但是使用调试器检查.*.*?这两种情况,.*.*?regex101.com/r/nG3tY4/1使用更少的步骤来完成内部优化(如果我们在禁用优化时比较两者,结果相同) .这仅适用于 PCRE。
【解决方案2】:
^(?:.(?!charsequence$))*$

试试这个。查看演示。

http://regex101.com/r/xT7yD8/15

【讨论】:

  • 检查和匹配每个字符后跟不是charsequence 需要更多的步骤。
猜你喜欢
  • 2018-02-26
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 2016-01-17
  • 2013-12-15
  • 2012-01-01
  • 2012-03-20
  • 1970-01-01
相关资源
最近更新 更多