正则表达式匹配EOF

时间:2009-07-23 12:01:30

标签: regex

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

john, dave, chris
rick, sam, bob
joe, milt, paul

我正在使用此正则表达式来匹配名称

/(\w.+?)(\r\n|\n|,)/

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

9 个答案:

答案 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|,|$)/