regex 什么时候应该在正则表达式中使用\A?

des4xlb0  于 2023-03-31  发布在  其他
关注(0)|答案(4)|浏览(137)

行尾锚$匹配,即使匹配的字符串中有额外的尾随\n,因此我们使用\Z而不是$
举个例子
^\w+$将匹配字符串abcd\n,但^\w+\Z不匹配
\A怎么样以及何时使用?

jpfvwuh4

jpfvwuh41#

由于\A只匹配整个文本的开头,而不是仅仅匹配一行的开头,所以在可以跨行匹配的正则表达式中,^\A的功能是不同的。

64jmpszr

64jmpszr2#

与任何正则表达式功能一样,当它更准确地描述了你需要的东西时,你可以使用它,而不是任何更一般的功能。如果你知道你想在字符串的开头(而不是逻辑行)精确匹配,请使用描述它的正则表达式功能。不要使用可能在你不想要的情况下匹配的正则表达式功能。
例如,Perl有默认正则表达式标志的想法。这些标志将应用于每个匹配的运算符,即使你没有指定它们:

use re '/imx';

如果你使用它,这意味着每个包含^$的模式都可能意味着字符串开头以外的东西,因为/m改变了这些锚的定义。\A永远不会改变它将匹配的位置。
这种情况不仅仅是一个可能的问题。我不得不与一个代码库搏斗,在那里有人决定遵循一些设置默认正则表达式标志的坏建议,几乎每个模式都被破坏了。例如,正则表达式中的文字空格在/x下变得无关紧要,这导致了许多其他问题。
对于Perl,请参阅perlre文档了解有关零宽度Assert的详细信息:

\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)
dgiusagp

dgiusagp3#

根据你使用的标签,这与你的问题没有直接关系,但是至少有一种语言(Ruby),其中^$ * 总是 * 表示行的开始/结束,所以如果你想匹配字符串的开始/结束,你 * 必须 * 使用\A\Z\z
如果你想让你的正则表达式保持可移植性,最好明确地说明你想让它们做什么,而不是依赖于模式修饰符的可用性,比如\mRegex.MULTILINE等。
另一方面,JavaScript,POSIX和XML不支持\A\Z。这就是像RegexBuddy这样的工具派上用场的地方,它可以为您将正则表达式从一种风格转换为另一种风格。

hpxqektj

hpxqektj4#

如果你正在使用的正则表达式风格支持\A,那么我建议你总是使用它而不是^\A总是在字符串的开头匹配,只有在所有支持它的风格中。
^可能只在字符串的开头匹配,也可能在任何一行的开头匹配,这取决于regex flavor和regex选项。
通过使用\A,当其他人必须维护您的代码时,您可以减少混乱的可能性。

相关问题