正则表达式匹配EOF

Rya*_*yan 81 regex

我有一些看起来像这样的数据

john, dave, chris
rick, sam, bob
joe, milt, paul
Run Code Online (Sandbox Code Playgroud)

我正在使用这个正则表达式匹配名称

/(\w.+?)(\r\n|\n|,)/
Run Code Online (Sandbox Code Playgroud)

大部分都有效,但文件在最后一个单词之后突然结束,意味着最后一个值没有结束\r\n,\n或者,它以EOF结束.有没有办法在正则表达式中匹配EOF,所以我可以把它放在第二个分组中?

Rya*_*yan 147

这个问题的答案\Z花了我一段时间来弄明白,但它现在有效.请注意,相反,\A匹配整个字符串的开头(与一行的开头相对^$匹配).

  • 如果你在netbeans中追求**项目文件搜索**而不是文件搜索中的****,那么下面的行为会有所不同......`((s*)\?> (\ s*)\ Z` ...并且经过一些挖掘后,对项目文件夹的工作原理是:`(\ s*)\?>(\ s*)(\n*)(\ W)\ Z`FYI:这是用文件末尾的换行符替换所有关闭的php标签. (5认同)

pax*_*blo 22

EOF实际上不是一个角色.如果你有一个多行字符串,那么'$'将匹配字符串的结尾以及一行的结尾.

在Perl和它的弟兄们,\A\Z匹配字符串的开头和结尾,完全不理行分解.

POSIX正则表达式的GNU扩展使用\`和使用\'相同的东西.


Eri*_*ikE 15

在Visual Studio中,您可以像这样找到EOF : $(?![\r\n]). 无论你的行结尾是CR,CRLF还是只是LF,这都有效.

作为奖励,您可以确保所有代码文件都有最终的换行标记,如下所示:

               Find What: (?<![\r\n])$(?![\r\n])
            Replace With: \r\n
 Use Regular Expressions: checked
Look at these file types: *.cs, *.cshtml, *.js
Run Code Online (Sandbox Code Playgroud)

这是如何工作的:

找到不在CR或LF之前的任何行结束(零宽度匹配),也不会跟随CR或LF.一些想法会告诉你为什么这个有效!

请注意,您应该替换为所需的行结束字符,无论是CR,LF还是CRLF.


Mar*_*rey 8

对比Ryan建议\ Z与\ z的行为:

$ perl -we 'my $corpus = "hello\n"; $corpus =~ s/\Z/world/g; print(":$corpus:\n")'
:helloworld
world:
$ perl -we 'my $corpus = "hello\n"; $corpus =~ s/\z/world/g; print(":$corpus:\n")'
:hello
world:
$ 

perlre sez:

\Z  Match only at end of string, or before newline at the end
\z  Match only at end of string

将测试用例翻译成Ruby(1.8.7,1.9.2)的行为相同.


Zla*_*tev 6

最近我正在寻找这样的东西,但对于 JavaScript。

把这个放在这里,这样任何有同样问题的人都可以受益

var matchEndOfInput = /$(?![\r\n])/gm;
Run Code Online (Sandbox Code Playgroud)

基本上这将匹配行尾,后面没有回车或换行符。本质上这与\ZJavaScript相同。