为什么我的正则表达式不起作用?

为什么我的正则表达式不起作用?

我有几行短语,例如

The quick brown fox jumps over the lazy dog
quick brown fox jumps over the lazy dog
brown fox jumps over the lazy dog

现在我想选择每行第一个单词后的其余部分。也就是说,我想标记从一行中第一个单词的末尾开始的所有内容。我的尝试是:

^(?:\w+).*

我在 Notepad++ 中使用它。为什么这会选择整行?我做错了什么?

谢谢你提高了我的正则表达式知识!

答案1

  • Ctrl+H
  • 找什么:^\S+\h+(.+)$
  • 用。。。来代替:$1
  • 检查环绕
  • 检查正则表达式
  • 取消选中. matches newline
  • Replace all

解释:

^           # beginning of line
  \S+       # 1 or more non space (you van use \w+ if you want to replace ONLY word characters)
  \h+       # 1 or more horizontal spaces
  (.+)      # group 1, 1 or more any character but newline
$           # end of line

给定示例的结果:

quick brown fox jumps over the lazy dog
brown fox jumps over the lazy dog
fox jumps over the lazy dog

屏幕截图:

在此处输入图片描述


以下是对您的正则表达式的解释:

^           # beginning of line
  (?:       # start non capture group
    \w+     # 1 or more word character
  )         # end group
  .*        # 0 or more any character

因此,它匹配一个单词以及该单词后面的所有内容。非捕获组在这里毫无用处。非捕获组并不意味着不会匹配,而只是不会捕获。它严格等同于:^\w+.*

答案2

您可以使用零宽度正向后视\K,例如:

^\w+[^\w]+\K.*

\w+匹配行首的第一个单词(Thequick),后面的空格字符会匹配[^\w]+(一个或多个非单词字符)。 并\K.*匹配其后的所有内容,但不包括\K匹配中的 之前的任何内容。

perl 文档中对此进行了描述:https://perldoc.perl.org/perlre.html#Lookaround-Assertions

您的正则表达式不起作用,因为您匹配的是行首,后面跟着一个或多个单词字符(无论您是否使用非捕获组(?:…)),后面跟着任意字符。问题是,行首的单词字符^(?:\w+)(与 相同^\w+)是匹配的一部分。

相关内容