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

如何对要与字符串replaceAll方法一起使用的正则表达式模式求反?

  •  -2
  • hemanik  · 技术社区  · 6 年前

    我希望得到一个只接受小写字母数字字符或 - . 如果字符串包含任何其他字符,则应将其替换为 - .

    我尝试了下面带有前瞻否定的正则表达式,但它附加了一个额外的 - 最后我怎样才能解决这个问题?

    public string sampleTest() {
      String name = "test-7657-hello.WOrld"
      return name.toLowerCase().replaceAll("(?![a-z0-9]([-a-z0-9]*[a-z0-9])?)", "-")
    }
    

    例如:应将点替换为 - 在上述示例中。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Srdjan M.    6 年前

    正则表达式 : ([^a-z0-9-])

    对于Java [^a-z0-9-] 匹配列表中不存在的单个字符,以便将其替换为 - .

    细节 :

    • [^] 匹配列表中不存在的单个字符 a-z 0-9 -
    • () 正在捕获组

    输出 :

    test-7657-hello---rld
    

    Regex demo

        2
  •  1
  •   GalAbra    6 年前

    如果要替换 每个 带连字符的字符,使用 /[^a-z0-9-]/g :

    abcd%$^.efg  -->  abcd----efg
    

    为了更换 整体 子字符串无效,请使用 /[^a-z0-9-]+/g :

    abcd%$^.efg  -->  abcd-efg
    

    最后,我热烈建议您阅读 /g (全局标志)正则表达式的属性。下次你就不用费劲了。