Regex 我应该在正则表达式中何时使用\A?

Regex 我应该在正则表达式中何时使用\A?,regex,Regex,即使匹配的字符串中有额外的尾随\n,行尾锚点$也要匹配,因此我们使用\Z而不是$ 比如说 ^\w+$将匹配字符串abcd\n,但^\w+\Z不匹配 \A以及何时使用如何?在启用多行匹配时最常用。由于\A只匹配整个文本的开头,而不仅仅是行的开头,因此在可以跨行匹配的正则表达式中,^和\A的功能是不同的。与任何正则表达式功能一样,当它更准确地描述您需要的内容时,您可以使用它,而不是任何更一般的功能。如果您知道您希望在字符串的开头(而不是逻辑行)精确匹配,请使用描述这一点的regex功能。不要使用可能

即使匹配的字符串中有额外的尾随
\n
,行尾锚点
$
也要匹配,因此我们使用
\Z
而不是
$

比如说

^\w+$
将匹配字符串
abcd\n
,但
^\w+\Z
不匹配


\A
以及何时使用如何?

在启用多行匹配时最常用。由于
\A
只匹配整个文本的开头,而不仅仅是行的开头,因此在可以跨行匹配的正则表达式中,
^
\A
的功能是不同的。

与任何正则表达式功能一样,当它更准确地描述您需要的内容时,您可以使用它,而不是任何更一般的功能。如果您知道您希望在字符串的开头(而不是逻辑行)精确匹配,请使用描述这一点的regex功能。不要使用可能在您不想要的情况下匹配的正则表达式功能

对于Perl,有关零宽度断言的详细信息,请参阅文档:

\b  Match a word boundary
\B  Match except at a word boundary
\A  Match only at beginning of string
\Z  Match only at end of string, or before newline at the end
\z  Match only at end of string
\G  Match only at pos() (e.g. at the end-of-match position
    of prior m//g)

根据您使用的标记,这与您的问题不直接相关,但至少有一种语言(Ruby)
^
$
始终表示行的开始/结束,因此,如果要匹配字符串的开始/结束,您必须使用
\A
\Z
\Z

如果您想让您的正则表达式保持可移植性,最好明确说明您希望它们做什么,而不是依赖于模式修饰符的可用性,如
\m
Regex.MULTILINE


另一方面,JavaScript、POSIX和XML不支持
\A
\Z
。这就是像这样的工具可以方便地为您将正则表达式从一种风格转换为另一种风格的地方

如果您使用的正则表达式支持
\A
,那么我建议您始终使用它,而不是
^
\A
始终仅在支持它的所有样式中匹配字符串开头。换行没有问题

^
可能仅在字符串开头匹配,也可能在任何行的开头匹配,具体取决于正则表达式的风格和正则表达式选项


通过使用
\A
您可以减少其他人必须维护您的代码时出现混淆的可能性。

+1谢谢,但是人们真的在使用它吗?删除
/m
和使用
^
不是同样的行为吗?是的,我使用它。请考虑尝试搜索一个字符串,您希望该字符串没有嵌入新行,但用户将它们放入其中。您希望能够搜索整个字符串,但是^和$会混淆,只扫描字符串的第一部分。最终可能会将一些有害代码注入查询或将其存储在数据库中。是的,这很令人困惑,但是\m、\A、\z、^和$有它们的用途,所以您需要了解何时何地使用它们。也许这不是一个很好的例子,但它确实很重要。也许有人可以添加一些真实世界的示例。例如,如果您试图在一组日志中匹配日志文件开头的一对特定行,则需要启用多行匹配,但不能仅使用
^
(因为您希望匹配日志文件开头的行,而不是中间的行)。这将是一个潜在的用例。你是说
^\w+\z
(小写z)
\Z
$
是相同的(当您不使用
/m
修饰符时)。@cjm,我在python上测试过,IMHO,它不一样,
^\w+\Z
不匹配,但是$匹配,但我不确定
\Z
的python和perl正则表达式实现是否不同,但是在python中,
\Z
\Z
是一样的,(我想因为我在python文档中没有看到
\Z
),我现在没有perl。@cjm,我刚刚在codepad.org上测试过,是的,python中的
\Z
是perl中的
\Z
,我认为这两种语言中的
\Z
是一样的。谢谢你提供关于ruby regex的信息,+1感谢Jan Goyvaerts的建议,这很有意义