匹配 EOF 的正则表达式

我有一些这样的数据:

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

我使用这个正则表达式来匹配名称:

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

这在大多数情况下是有效的,但是文件在最后一个单词之后突然结束,这意味着最后一个值不以 \r\n\n,结束。以 EOF 结束。有没有办法在正则表达式中匹配 EOF,这样我就可以把它放在第二组中?

113171 次浏览

这个问题的答案是 \Z花了我一段时间才弄明白,但它现在可以工作了。请注意,相反,\A匹配整个字符串的开头(而 ^$匹配一行的开头)。

Python:
匹配绝对字符串末端

Java C# (.NET)PHPPerl:
匹配字符串结尾(如果存在,在最后换行之前)
匹配绝对字符串末端

转到 :
\z Match absolute string end

以上所有:
匹配绝对字符串末端

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

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

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

在 Perl 及其兄弟程序中,\A\Z匹配字符串的开头和结尾,完全忽略换行符。

GNU extensions to POSIX regexes use \` and \' for the same things.

如果不需要捕获行分隔符,那么只需要下面的正则表达式:

/\w+/

这是假设您希望匹配的所有子字符串都完全由单词字符组成,如您的示例所示。

Maybe try $ (EOL/EOF) instead of (\r\n|\n)?

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

对比 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:

经济学人:

\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)也是如此。

在注释中,姆德米尔巴补充道表示 Java 是相同的。

你可以像这样找到 EOF: $(?![\r\n])。无论你的行结尾是 CR,CRLF,或者只是 LF,这都是有效的。适用于 Visual Studio,VS Code,Python,Java,C # ,JavaScript 和 PHP,但不适用于 Go。

另外,在 VisualStudio 中,您可以确保所有代码文件都有一个最终的换行标记,如下所示:

               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 之后的行结束(零宽度匹配)。一些想法会告诉你为什么这个工作!

Note that you should Replace With your desired line-ending character, be it CR, LF, or CRLF.

由于 JavaScript RegEx 不支持最终终止符(\Z)的边界匹配,您可以使用以下代码:

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

Basically this would match the end of the line, which is not followed by carriage return or new line characters. In essence it behaves the same way as \Z and can be used with JavaScript RegEx implementation.

If lookahead and lookbehind are supported by the regex engine you're using, use:

  • (?<![\r\n])^ to emulate \A, match absolute string start.
    (\A支持 Python、 Java、 C # 、 PHP & Go)

  • 模拟 \z,匹配绝对字符串结尾。
    (\z可以在 Java,C # (. NET) ,PHP,Perl & Go 中使用。在 Python 中,\Z的行为类似于 \z)

  • 模拟 \Z,匹配字符串结尾(如果存在最后换行符之前)。
    (\Z可以在 Java、 C # (. NET)、 PHP 和 Perl 中使用,在 Python 中,\Z的行为类似于 \z)

如果你所有的行尾都是 \n,你可以简化以上步骤:

  • \A: (?<!\n)^

  • \z: $(?!\n)

  • \Z: (?=\n?$(?!\n))

注意: JavaScript一直支持向前看(用于上面的 \z\Z模拟) ,但是向后看(用于上面的 \A模拟)支持更新,并且由于 Safari/WebKit 的限制仍然有限,详情请参阅 Caniuse.comBug webkit.org。从 v9开始,Node.js 就有了后台支持。