正则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|,|$)/