正则表达式不匹配行

3

我希望你能够告诉我如何编写一个正则表达式,用于选择所有不包含模式:(.*:.*)的行。

我尝试使用以下方式:

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

来自这个网站,但是我无法让它正常工作。


值得注意的是,grep 命令有一个 -v 标志,它可以反转结果,即显示所有不匹配所传入模式的行。 - Squidly
4个回答

4

从这个描述中,我理解你想要选择所有不包含 : 的行。

为了实现这一目的,您可以使用以下正则表达式:

^([^:]+)$


感谢您的回复。我想问一下,是否可以删除所有以冒号开头的行,但只保留前三行没有冒号的行?现在我有一个正则表达式,它可以匹配具有冒号和不具有冒号的行,但无法将它们结合在一起。 - DropDropped
1
个人而言,我不会使用正则表达式来做那样的操作。这种操作更适合用你所使用的编程语言来完成。在这种情况下,只需读取每一行,确定它是否有“:”,然后相应地处理即可,这可能更容易些。一旦涉及到更复杂的查找/替换/删除操作,正则表达式就变得不太实用且更难使用了,因此通常建议只使用你所编写代码的父语言来完成任务,因为这通常更高效且更易于阅读。 - qJake

3

只需使用这个模式,并设置选项g表示全局匹配和m表示多行匹配:

^([^:]*)$

* 更改为 +,如果您不想捕获空行(您未指定)。
Fiddle: http://www.rexfiddle.net/pmEFFQR

2

我认为(.*:.*)的意思是,0或多个任意字符,后跟“:”,后跟0或多个任意字符。因此以下内容将匹配:

  • a:b
  • abc:def
  • :abc
  • abc:
  • :

基本上,如果我们将其分解,我们要寻找不包含“:”字符的任何行。因此,像这样的东西就可以工作。

^[^:]+$

0
使用以下正则表达式:

^(?!(.*:.*)).*(\n|$)

?!(.*:.*) 是负向前瞻,以确保前面没有与 .*:.* 匹配的模式。

此类零个或多个字符的行由以下的 .* 匹配,并且后面必须跟换行符 (\n) 或字符串结尾 ($)。


我错过了换行。 - Naveed S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接