【问题标题】:not sure why this Perl regex doesnt work (character class)不知道为什么这个 Perl 正则表达式不起作用(字符类)
【发布时间】:2015-09-09 14:45:05
【问题描述】:

我正在尝试在另一个特定字符前面添加一个字符,除非它前面已经有我要注入的字符。这很好用(在任何 Z 之前插入一个 n,除非它之前已经有一个 n):

s/([^n])Z/$1nZ/g;

除了前面没有任何内容的单词边界。所以要解决我尝试过的问题:

s/([\b^n])Z/$1nZ/g; # does not work

s/(\b|[^n])Z/$1nZ/g; # does work

为什么#1 不起作用?看起来合法吗?

【问题讨论】:

  • 如果^不在字符类的开头,则表示文字字符^否定这个字符类。
  • 在同一个字符类中不能有正负匹配,负类以^开头所以[\b^n]匹配任何单词边界,^或n
  • 请注意[\b^n] 是一个包含三个或四个元素的字符类(^n 很简单;\b 可能是'退格'或反斜杠和b);哪个都没有关系,因为你想要的也不是。许多元字符在字符类中失去了它们的特殊含义。

标签: regex perl regex-negation character-class


【解决方案1】:

[\b^n]的两个问题:

  • ^ 仅在第一个字符时否定字符类。

  • [...] 匹配一个字符,但您尝试匹配的不是字符。其中\b 代表字符08(退格)。

【讨论】:

    【解决方案2】:

    谢谢大家——从来不知道 ^ 在位置 1 中是不同的,在 CC 中。

    我将它移到 CC 之外(标记开头),它按预期工作。我想我明白他们为什么这样做了(所以你可以在 [] 中使用 ^ 来表示插入符号而不是否定)。但似乎逃避它会产生同样的效果。有时我想知道拉里在想什么,但自从我们公司削减 OSCON 差旅后我再也见不到他了……

    非常感谢...

    【讨论】:

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