如何否定与String replaceAll方法一起使用的正则表达式模式?

时间:2018-01-19 11:30:09

标签: java regex regex-negation

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

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

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

例如:在上面的例子中,应该用-替换点。

2 个答案:

答案 0 :(得分:2)

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

让Java [^a-z0-9-]匹配列表中不存在的单个字符,以便-替换它们。

<强>详情:

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

<强>输出

test-7657-hello---rld

ecmascript

答案 1 :(得分:1)

如果您想用连字符替换每个字符,请使用/[^a-z0-9-]/g

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

要替换整个无效的子字符串,请使用/[^a-z0-9-]+/g

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

最后,我热烈建议您阅读正则表达式的/g(全局标志)属性。下次你会省力的。