2011-06-13 312 views

回答

3

为什么没有下面的正则表达式的工作:

你的表情可以细分到

  • (.*(\[.*?\])((\/)?)),或
  • (\@(.*))

前者部分可以被分解成

  • .*,随后
  • \[.*?\](这是不一样的(\[.*\])?),可能随后
  • /

这里的另一个建议:

String part = "[^/\\[\\]]+(\\[\\d*\\])?"; 
String pattern = String.format("%s(/%<s)*(@.*)?", part); 

测试用例:

String[] tests = { 
     "org/com[2]/net[4]/[email protected]", 
     "org/com[2]/net[4]", 
     "org/com[2/net", 
     "org/com2]/net", 
     "org/com[2]/net", 
     "org/com[2]/net/", 
     "org/com[2]/[email protected]", 
}; 

for (String test : tests) 
    System.out.println(test + ": " + test.matches(pattern)); 

输出:

org/com[2]/net[4]/[email protected]: true 
org/com[2]/net[4]: true 
org/com[2/net: false 
org/com2]/net: false 
org/com[2]/net: true 
org/com[2]/net/: false 
org/com[2]/[email protected]: true 
+0

嗨aioobe,thaks一个很好的解决方案,但我怎么验证组织/ COM [ 2]/net [4]/uk @ name/test,这应该为我提供假。由于只能有一个'@',并且在一些文本之后(没有/,[,]),应该注意别的。 – Tirtha 2011-06-13 13:56:28

+0

通过验证我假设你的意思是“弄清楚它是否遵循该模式”。要验证字符串'str',你需要'str.matches(pattern)',其中'pattern'是我答案中的字符串。 – aioobe 2011-06-13 13:58:08

+0

如果'@'是“部分”中的禁止字符,则在上面的答案中将'[^/\\ [\\]]'更改为[^/\\ [\\] @]'。 (在'[^'...']'之间列出所有“禁止”字符。 – aioobe 2011-06-13 13:59:02

1

试试这个。