和其他人一样,我只有传递正则表达式的知识。
即便如此,我认为这样做非常简单,但它并没有按照我认为应该的方式运作。
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
有一段时间以来,我第一次意识到有一些基本的东西,我根本就没有意识到正则表达式。有人想开导我吗?
答案 0 :(得分:6)
字符串中有不间断的空格字符(U+00A0
)。这可能不适用于正则表达式的“空白”修饰符。
这些不间断的空格字符用于标记(例如HTML:
),表示不应插入自动换行符。
答案 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');