8

考虑以下正则表达式:

/xyz^abc/
/xyz$abc/

这些将匹配什么?

我知道

  • 插入符号 ( ^) 在正则表达式的开头使用时,匹配行的开头
  • 美元符号 ( $) 在正则表达式末尾使用时,与行尾匹配
  • 插入符号 ( ^),当用作字符类的第一个字符时,否定该类

我相信给定的正则表达式永远不会匹配任何东西,但我不确定。

4

3 回答 3

7

根据选项,正则表达式中间的a^或 a可能会导致匹配:$

>>> if re.search(r'xyz.^abc', "xyz\nabc", re.MULTILINE | re.DOTALL):
...    print "Matched"
...
Matched

MULTILINE^匹配一行的开头,即使该行不在字符串的开头 。匹配换行符DOTALL.

(我找不到使您的确切示例匹配任何内容的方法。)

于 2013-07-26T19:53:09.510 回答
5

那些不会匹配任何东西。然而:

/(xyz$|^xyz)/

这将匹配任何以 xyz 开头或结尾的行。

更新:

Andy G 指出多行模式可能会为您的正则表达式字符串找到匹配项。但这仅适用于将实现配置为支持中间字符串锚匹配的情况。

这是来自Regular-Expressions.info(我最喜欢的学习和理解正则表达式的地方):

如果您有一个由多行组成的字符串,例如第一行\n第二行(其中 \n 表示换行符),通常希望使用行而不是整个字符串。因此,本教程中讨论的所有正则表达式引擎都可以选择扩展这两个锚点的含义。然后 ^ 可以匹配字符串的开头(在上述字符串中的 f 之前),以及每个换行符之后(在 \n 和 s 之间)。同样,$ 仍将匹配字符串的末尾(最后一个 e 之后),以及每个换行符之前(e 和 \n 之间)。

在像 EditPad Pro 或 GNU Emacs 这样的文本编辑器以及像 PowerGREP 这样的正则表达式工具中,插入符号和美元总是在每行的开头和结尾匹配。这是有道理的,因为这些应用程序旨在处理整个文件,而不是短字符串。

在本网站讨论的所有编程语言和库中,除了 Ruby,您必须明确激活此扩展功能。传统上称为“多线模式”。在 Perl 中,您可以通过在正则表达式代码后添加一个 m 来做到这一点,如下所示:m/^regex$/m;。在 .NET 中,当您指定 RegexOptions.Multiline 时,锚点在换行符之前和之后匹配,例如在 Regex.Match("string", "regex", RegexOptions.Multiline) 中。

于 2013-07-26T19:49:18.537 回答
0

在 Perl 中,$也用于将字符串变量插值到正则表达式中:

my $abc = 'pqr';
my $result = ('xyzpqr' =~ /xyz$abc/);   # $result is now true
于 2013-07-26T21:38:13.543 回答