代码之家  ›  专栏  ›  技术社区  ›  Joshua

正则表达式中的否定交替

  •  4
  • Joshua  · 技术社区  · 14 年前

    我可以在正则表达式中使用“Alternation”来匹配任何出现的“cat”或“dog”:

    (cat|dog)
    

    是否可以否定这种交替,并匹配任何不是“猫”或“狗”的东西?

    例如:

    也就是说:

    (\.)(\s+[A-Z][^.]|\s*?$)
    

    以下段落:

    那只敏捷的棕色狐狸跳过了那只懒狗。曾几何时,桑奇博士、帕森斯先生和梅森州长去了商店。你好,世界。

    我在Dr.先生和Gov。

    (我正在测试 http://regexpal.com/ 如果你想看看我在上面的例子中看到的东西)

    因为这是不正确的,我想说:

    !(Dr\.|Mr\.|Gov\.)(\.)(\s+[A-Z][^.]|\s*?$)
    

    我也试过了!/(博士|先生|政府)/,还有!~也没用。

    如何避免“博士”、“先生”和“州长”等的匹配?

    提前谢谢。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Jeremy W. Sherman    14 年前

    这是不可能的。通常情况下你会用负后视镜 (?<!…) ,但JavaScript的regex风格不支持此功能。相反,你必须在事实发生后过滤匹配项以丢弃那些你不想要的匹配项。

        2
  •  0
  •   ghostdog74    14 年前

    在Perl/awk这样的语言中,有 !~ 操作人员

    $string !~ /(cat|dog)/

    在Actionscript中,您可以使用NOT运算符 ! 否定匹配。见 here here 用于regex口味比较

        3
  •  0
  •   Ruel    14 年前

    你可以这样做:

    !/(cat|dog)/
    

    var pattern2:RegExp = !/(cat|dog)/;
    
        4
  •  0
  •   Sold Out Activist    14 年前

    (?!不是这个东西)是你想要的,也就是所谓的消极展望小组。

    不幸的是,它不会按你的意愿工作。 由于第二个分组,仍将返回属于“Sanches博士”的周期。Regex解析器会对自己说,“是的,这个“.”不是“Dr.” /((?!博士)/

    更重要的是,不管怎样,你都会看完“结束”这句话。Actionscript没有“全部匹配”,只有先匹配。必须设置全局标志(或在正则表达式末尾添加g),然后调用exec,直到result对象为空。

    var string = 'The quick brown fox jumps over the lazy dog. Once upon a time Dr. Sanches, Mr. Parsons and Gov. Mason went to the store. Hello World.';
    
    var regx:RegExp = /(?!Dr\.)(\.)/g;
    var result:Object = regx.exec(string);
    
    for (var i = 0; i < 10; i++) { // paranoia
      if (result == null || result.index == 0) break; // again: paranoia
      trace(result.index, result);
      result = regx.exec(string);
    }
    
    // trace results:    
    //43 .,.
    //64 .,.
    //77 .,.
    //94 .,.
    //119 .,.
    //132 .,.