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

如何优化这个正则表达式?

  •  2
  • celsowm  · 技术社区  · 14 年前

    我的工具坏了 纯文本 生成“标签” 替换条款 从标签中的文本。由于某些复合词的存在,导致 唯一的办法 (我想) 是否使用ReplaceAll 正则表达式

    感谢stackoverflow的朋友们,在我的最后一个问题中,我的应用程序得到了一个非常好的正则表达式,但是经过测试,出现了一个新的需求:

    “替换标记外和另一个单词外的所有单词的正则表达式”

    原始代码:

    String str = "world worldwide <a href=\"world\">my world</world>underworld world";
    str = str.replaceAll("\\bworld\\b(?![^<>]*+>)", "repl");
    System.out.println(str);
    

    不是

    预期结果 :

    repl worldwide <a href="world">my world</world>underworld repl
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   polygenelubricants    14 年前

    我不认为regex是这项工作的最佳工具,但是如果你只是想调整和优化你现在拥有的,你可以使用boundary这个词 \b ,扔掉不必要的捕获组和可选的重复说明符,使用所有格重复:

    \bworld\b(?![^<>]*+>)
    

    这个 \bworld\b "world" 被零宽度单词边界锚定所包围。这将阻止它与 “世界” 在里面 "underworld" "worldwide" \b世界\b "a_world_domination" .

    原始模式还包含一个子模式 (x+)? . 这可能是更好的表述为简单 x* . 也就是说,不是“零或一” ? “一个或多个” + ,简单地说是“零或更多” *

    捕获组 (…) (?:…)

    另请注意 [^<] ,我们现在禁止使用 [^<>]

    (The) […] 是一个 character class [aeiou] 匹配任何一个小写元音。 [^…] 是一个 角色类。 [^aeiou] 任何事 小写元音。)

    当然 (?!…) 消极的 不是

    \bworld\b(?![^<>]*+>)
    \_______/\__________/ NOT the case that
     "world"                      the first bracket to its right is a closing one
     surrounded by
     word boundary anchors
    

    工具书类


    注意,要在Java字符串文本中获得反斜杠,需要将其加倍,因此作为Java字符串文本的整个模式是 "\\bworld\\b(?![^<>]*+>)"