2016-09-30 34 views
-1

阅读了很多问题和答案,但不知道如何解决我的问题。正则表达式匹配任意组合中的一个字符

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

23424(223)+32 -32

允许在满弦是:随时随地

  • 任何number多次字符串的
  • 一次的)任何地方字符串
  • 一次性(任何地方的t他字符串
  • 一次
  • 多次字符串的+任何地方字符串的spaces随时随地
  • 多次-字符串

对我来说最的问题是要找到一个时间字符的任意位置字符串的任何地方。希望您能够帮助我。

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

+3

请问谁downvoted这个人请解释他们为什么? – Foitn

+3

你到目前为止尝试过什么?从你的问题来看,')3(+'也是有效的,对吗?如果不是,请提供更多的例子,并且对你的具体问题有更清晰的描述。请提供[最小,完整和可验证的例子](http:// stackoverflow.com/help/mcve),也可以再次阅读[我如何问一个好问题?] –

+0

@MartinNyolt我尝试了很多组合。不会发布它们,但是我努力的是所有规则的组合,最后是字符串任意位置的一个计时器,并且是')3('允许 – Patrick

回答

2

你可以使用这个表达式负向前看符号:

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

我们使用3负的样子aheads:

(?!.*\(.*\() # 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()+-]+$"; 
+0

This也匹配不包含'(',')'和'+'的'3'。 –

+0

是的,这个正则表达式允许0或一个'(',')'或'+'。这就是我对这个问题的解释。 – anubhava

+1

为此soultion的三个downvotes是完全正确的;)谢谢。 – Patrick

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) 

当与循环中完成,检查每一次角色在地图和看看哪一个有一个以上发生

相关问题