我有一些看起来像这样的数据
john, dave, chris
rick, sam, bob
joe, milt, paul
我正在使用此正则表达式来匹配名称
/(\w.+?)(\r\n|\n|,)/
大部分都有效,但文件在最后一个单词之后突然结束,这意味着最后一个值不会以\r\n
,\n
或,
结束,而是以EOF结尾。有没有办法在正则表达式中匹配EOF,所以我可以把它放在第二个分组中?
答案 0 :(得分:138)
这个问题的答案是\Z
花了我一段时间才弄明白,但它现在有效。请注意,相反,\A
匹配整个字符串的开头(而不是匹配一行开头的^
和$
)。
答案 1 :(得分:21)
EOF实际上并不是一个角色。如果你有一个多行字符串,那么'$'将匹配字符串的结尾以及一行的结尾。
在Perl及其兄弟中,\A
和\Z
匹配字符串的开头和结尾,完全忽略换行符。
POSIX正则表达式的GNU扩展使用\`
和\'
来表示同样的事情。
答案 2 :(得分:13)
在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
这是如何运作的:
查找不在CR或LF之前的任何行结束(零宽度匹配),并且也不跟随CR或LF。一些想法会告诉你为什么这样有效!
请注意,您应该替换为所需的行尾字符,无论是CR,LF还是CRLF。
答案 3 :(得分: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)的行为相同。
答案 4 :(得分:2)
你真的必须捕获行分隔符吗?如果没有,这个正则表达式应该是你所需要的:
/\w+/
假设您要匹配的所有子字符串都完全由单词字符组成,就像您的示例中一样。
答案 5 :(得分:2)
也许尝试$(EOL / EOF)代替(\ r \ n | \ n)?
/\"(.+?)\".+?(\w.+?)$/
答案 6 :(得分:1)
假设您正在使用适当的修饰符强制将字符串作为一个整体处理(不是逐行 - 如果\ n适用于您,您正在使用它),只需添加另一个选项 - 字符串结尾:(\ r \ n \ n | \ N |,| $)
答案 7 :(得分:1)
最近我一直在寻找类似的东西,但是对于JavaScript。
将此放在此处,以便任何具有相同问题的人都可以受益
var matchEndOfInput = /$(?![\r\n])/gm;
基本上这将匹配行的结尾,后面没有回车符或换行符。实质上,这与\Z
相同,但对于JavaScript。
答案 8 :(得分:0)
/(\w.+?)(\r\n|\n|,|$)/