正则表达式以任意组合一次匹配一个字符

时间:2016-09-30 07:20:36

标签: java regex

阅读很多问题和答案,但不知道如何解决我的问题。

我有一个像这样的字符串:

23424(223)+32 -32

允许完整的字符串是:

  • 在String
  • 的任何位置多次number
  • String
  • 的任何地方)一次
  • String
  • 的任何地方(一次
  • String
  • 的任何地方+一次
  • String
  • 的任意位置多次spaces
  • String
  • 的任意位置多次-

对我来说,最大的问题是在String的任何地方找到一次性字符。希望你能帮帮我。

此示例字符串不应匹配。 23424(223)3+3)2 -32

2 个答案:

答案 0 :(得分:2)

您可以将此正则表达式用于负向前瞻:

^(?!.*\(.*\()(?!.*\).*\))(?!.*\+.*\+)[\d ()+-]+$

我们正在使用3个负向前瞻:

(?!.*\(.*\()  # Negative lookahead to disallow more than one (
(?!.*\).*\))  # Negative lookahead to disallow more than one )
(?!.*\+.*\+)  # Negative lookahead to disallow more than one +

RegEx Demo

参考: Lookarounds in regex

在Java中使用:

String regex = "^(?!.*\\(.*\\()(?!.*\\).*\\))(?!.*\\+.*\\+)[\\d ()+-]+$";

答案 1 :(得分:0)

你可以在没有正则表达式的情况下解决它,只需遍历字符串,然后将每个字符放在具有此逻辑的地图中

        if(map.get(str.charAt(i)) == null)
              map.put(str.charAt(i),1)
         else 
              map.put(str.charAt(i),map.get(str.charAt(i))+1)

完成循环后,检查地图中的每个时间字符,看看哪一个出现多次