【问题标题】:Why is a leading space stopping a regular expression from matching?为什么前导空格会阻止正则表达式匹配?
【发布时间】: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

如您所见,&lt;link...&gt;### 替换——因此正则表达式匹配。

当我在正则表达式前添加一个空格时,它不再匹配

$ 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 属性:)

标签: regex perl unicode


【解决方案1】:

如果您将字符串复制到 Notepad++ 中,则该字符串是列出 ANSI( ) 之后的特殊字符。所以空间不会匹配它。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多