【发布时间】:2014-08-25 20:10:12
【问题描述】:
我的正则表达式 '(\<link [^\>]+\>)' 匹配得很好,但是在它前面添加了一个空格,它没有:' (\<link [^\>]+\>)'(没有 ')。
当我使用正则表达式匹配 link 标记时,它完全匹配:
$ echo '<para>Please see Listing <link href="#lst:11-alg1">2.1</link> with the' \
| perl -pe 's|(\<link [^\>]+\>)|###|g'
<para>Please see Listing ###2.1</link> with the
如您所见,<link...> 被 ### 替换——因此正则表达式匹配。
当我在正则表达式前添加一个空格时,它不再匹配:
$ echo '<para>Please see Listing <link href="#lst:11-alg1">2.1</link> with the' \
| perl -pe 's| (\<link [^\>]+\>)|###|g'
<para>Please see Listing <link href="#lst:11-alg1">2.1</link> with the
结果还是原来的文本,没有进行替换——正则表达式不匹配。
我认为问题出在贪婪匹配(但我无法想象在哪里),我玩弄了+?-modifiers 和\s,但没有效果。而且也不是正则表达式以' ' 开头:当我将Listing 添加到它不匹配的模式时:
$ echo '<para>Please see Listing <link href="#lst:11-alg1">2.1</link> with the' \
| perl -pe 's|Listing (\<link [^\>]+\>)|###|g'
<para>Please see Listing <link href="#lst:11-alg1">2.1</link> with the
我什至用 Python 尝试过同样的方法:结果相同,所以我的正则表达式一定有问题。
【问题讨论】:
-
这不是你日常的普通空间,而是一个“人物空间”(Unicode U+2007)。
-
这是一个空间,吉姆,但不是我们所知道的......
-
@towi 如果字符串被解码并且您的 perl 不是古老的,
\s将匹配该字符。但是如果你不解码你的输入,那么它就不会匹配:) -
@Borodin U+00A0 属于遗留语义,因为它在 U+00FF 之下。
/\s/u总是在 5.14+ 中匹配它。\s没有/u匹配它unpredictably;在字符串上设置 utf8 标志,或在模式中提及某些内容,将导致它匹配。 -
@Borodin
/u启用正确的 unicode 语义,其中 U+00A0 与\s匹配,因为它具有Space属性:)