我有几行短语,例如
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+
匹配行首的第一个单词(The
或quick
),后面的空格字符会匹配[^\w]+
(一个或多个非单词字符)。 并\K.*
匹配其后的所有内容,但不包括\K
匹配中的 之前的任何内容。
perl 文档中对此进行了描述:https://perldoc.perl.org/perlre.html#Lookaround-Assertions
您的正则表达式不起作用,因为您匹配的是行首,后面跟着一个或多个单词字符(无论您是否使用非捕获组(?:…)
),后面跟着任意字符。问题是,行首的单词字符^(?:\w+)
(与 相同^\w+
)是匹配的一部分。