为什么这个正则表达式不符合我的预期?

时间:2011-08-25 04:37:35

标签: regex

和其他人一样,我只有传递正则表达式的知识。

即便如此,我认为这样做非常简单,但它并没有按照我认为应该的方式运作。

Section\s+(\d+\.\d+)\s+([^\n]+)

在我看来,上面的表达应该匹配:

  • “部分”一词,
  • 后跟一个或多个空格,
  • 后跟一些数字,一个点和一些其他数字,
  • 后面跟一些空格,
  • 后面是一些不包括换行符的文字

当我像这样在Rubular上测试我的正则表达式时,为什么doesn't it match any of these

Section 2.1  Expenses of the Initial Public Offering  
Section 2.2  Termination of Professional Services Agreement  
Section 2.3  Individual Noteholders Fee  
Section 2.4  Proceeds to the Company  
Section 2.5  Repayment of Notes and Redemption of Preferred Stock  

有一段时间以来,我第一次意识到有一些基本的东西,我根本就没有意识到正则表达式。有人想开导我吗?

3 个答案:

答案 0 :(得分:6)

字符串中有不间断的空格字符(U+00A0)。这可能不适用于正则表达式的“空白”修饰符。

这些不间断的空格字符用于标记(例如HTML: ),表示不应插入自动换行符。

Wikipedia Reference

答案 1 :(得分:4)

使用您提供的链接,我注意到如果您“替换”示例文本中某行的空格(带空格),则正则表达式匹配。它看起来几乎像那个正则表达式检查器中的错误?

要了解我的意思,请将示例保留在那里,然后使用\s+作为正则表达式。它与每个空间都不匹配。我不知道为什么键入替换空格有效。

答案 2 :(得分:2)

在Perl中,它有效:

use strict;
use warnings;

my @list = ( "Section 2.1  Expenses of the Initial Public Offering",
             "Section 2.2  Termination of Professional Services Agreement",
             "Section 2.3  Individual Noteholders Fee",
             "Section 2.4  Proceeds to the Company",
             "Section 2.5  Repayment of Notes and Redemption of Preferred Stock",
           );

foreach my $item (@list)
{
    print "$item:\n($1) <<$2>>\n" if ($item =~ m/Section\s+(\d+\.\d+)\s+([^\n]+)/);
}

输出:

Section 2.1  Expenses of the Initial Public Offering:
(2.1) <<Expenses of the Initial Public Offering>>
Section 2.2  Termination of Professional Services Agreement:
(2.2) <<Termination of Professional Services Agreement>>
Section 2.3  Individual Noteholders Fee:
(2.3) <<Individual Noteholders Fee>>
Section 2.4  Proceeds to the Company:
(2.4) <<Proceeds to the Company>>
Section 2.5  Repayment of Notes and Redemption of Preferred Stock:
(2.5) <<Repayment of Notes and Redemption of Preferred Stock>>

这导致我推断你没有使用Perl,或者你正在使用Perl但没有正确地将表达式嵌入到匹配中。在这两者中,我认为你更有可能不使用Perl。


我修改了Perl脚本以从标准输入读取。

while (<>)
{
    chomp;
    print "$_:\n";
    print "($1) <<$2>>\n" if ($_ =~ m/Section\s+(\d+\.\d+)\s+([^\n]+)/);
}

当我提供包含UTF-8 U + 00A0(0xC2 0xA0)的标准输入代替空格时,MacOS X 10.7.1上的Perl 5.14.1也无法识别正则表达式。但是,当我调整脚本以在while循环之前包含此行时,它确实按预期工作:

binmode(STDIN, ':utf8');