正则expression式来匹配EOF

我有一些这样的数据

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

我正在使用这个正则expression式来匹配名称

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

这在大部分情况下是可行的,但文件在最后一个词之后突然结束,意味着最后的值不以\r\n\n结尾,或者以EOF结束。 有没有办法在正则expression式中匹配EOF,所以我可以把它放在第二个分组?

这个问题的答案是\Z拿了一段时间来弄明白,但现在它工作。 请注意,相反, \A匹配整个string的开头(而不是^$匹配一行的开头)。

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

在Perl及其弟弟中, \A\Z匹配string的开头和结尾,完全忽略了换行符。

对于POSIX正则expression式的GNU扩展使用\`\'来表示相同的东西。

在Visual Studio中,你可以像这样findEOF: $(?![\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)进行replace。

对比Ryanbuild议的\ Z与\ z的行为:

 $ perl -we'my $ corpus =“hello \ n”;  $ corpus =〜s / \ Z / world / g; 打印( “:$语料库:\ n”)”
 :你好,世界
世界:
 $ perl -we'my $ corpus =“hello \ n”;  $ corpus =〜s / \ z / world / g; 打印( “:$语料库:\ n”)”
 :你好
世界:
 $ 

perlre sez:

 \ Z仅匹配string的末尾,或匹配换行符的末尾
 \ z只匹配string的末尾

testing用例翻译成Ruby(1.8.7,1.9.2)的行为是一样的。

你真的必须捕捉行分隔符? 如果没有,这个正则expression式应该是你所需要的:

 /\w+/ 

这是假设你想要匹配的所有子string完全由单词字符组成,就像在你的例子中一样。

也许试试$(EOL / EOF)而不是(\ r \ n | \ n)?

 /\"(.+?)\".+?(\w.+?)$/ 

假设你正在使用适当的修饰符强制来将string作为一个整体来处理(而不是逐行处理,并且如果\ n适用于您,则使用它),只需添加另一个替代方法 – string的结尾:(\ r \ n | \ N |,| $)

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