我有一些看起来像这样的数据
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
匹配整个字符串的开头(与一行的开头相对^
并$
匹配).
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.
对比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)的行为相同.
最近我正在寻找这样的东西,但对于 JavaScript。
把这个放在这里,这样任何有同样问题的人都可以受益
var matchEndOfInput = /$(?![\r\n])/gm;
Run Code Online (Sandbox Code Playgroud)
基本上这将匹配行尾,后面没有回车或换行符。本质上这与\Z
JavaScript相同。