正则表达式匹配EOF


90

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

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

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

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

大部分情况下有效,但是文件在最后一个单词之后突然结束,这意味着最后一个值不以结束\r\n\n或者,以EOF结尾。有没有办法在正则表达式中匹配EOF,这样我就可以在第二个分组中正确设置了吗?


您是要捕获一个名称组中的所有名称还是每个名称捕获一个名称组?
Andrew Hare

遇到正则表达式时,要做的一件事是尝试隔离您的模式元素。如果您最后担心令牌,请在不使用令牌的情况下测试您的表达式。
akf

只是想添加一个很棒的正则表达式测试站点:regexplanet.com/simple
northpole


@Sinan-我同意;合并
Marc Gravell

Answers:


159

这个问题的答案\Z花了我一段时间才能解决,但现在可以了。请注意,相反地,\A匹配整个字符串的开头(与^$匹配一行的开头)。


5
如果您是在netbeans中进行项目文件搜索而不是在文件内搜索,那么请注意以下内容的行为会有所不同... (\s*)\?>(\s*)\Z...在这里进行了更多挖掘之后,这将适用于项目文件夹:(\s*)\?>(\s*)(\n*)(\W)\Z 仅供参考:这是用文件末尾的换行符替换所有关闭的php标记。
MediaVince 2014年

1
原来\A也可以在Visual Studio中查找和替换。一如往常谨慎地使用这些东西,但是一旦我感到高兴,它实际上省去了很多麻烦,实际上它会做正确的事。
Steve Pettifer

当我使用Java的Scanner类一次读取整个文件时;如果我\Z用作分隔符,则会修剪尾随换行符。当我将定界符更改为时\z,保留了尾随换行符。似乎Martin Dorey的答案也适用于Java。
mmdemirbas

24

EOF实际上不是字符。如果您有多行字符串,则“ $”将匹配字符串的末尾和行尾。

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

POSIX正则表达式的GNU扩展用于\`\'具有相同的用途。


17

在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。


Visual Studio 2019中存在一个错误,用此替换全部可能会导致在文件末尾添加两个换行符。我认为这与在保存选项中自动插入换行符有关。
Stevoisiak

9

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

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

perlre sez:

\ Z仅在字符串末尾或末尾换行符之前匹配
\ z仅在字符串末尾匹配

将测试用例转换为Ruby(1.8.7,1.9.2)的行为相同。


2

您是否真的必须捕获行分隔符?如果不是,则此正则表达式应该是您所需要的:

/\w+/

假设您要匹配的所有子字符串都完全由文字字符组成,例如您的示例。



2

最近,我正在寻找类似这样的东西,但只适合JavaScript。

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

var matchEndOfInput = /$(?![\r\n])/gm;

基本上,这将与行的末尾匹配,后跟回车符或换行符。本质上,这与\ZJavaScript 相同。


1

假设您使用适当的修饰符强制将字符串作为一个整体对待(不是逐行处理-如果\ n对您有用,那么您正在使用它),只需添加另一种替代方法-字符串结尾:(\ r \ n | \ n |,| $)


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.