2012-07-12 66 views
1

以下正则表达式在Eclipse的查找对话框中工作,但在Java中引发异常。模式语法错误

我找不到为什么在执行时

(?<=(00|\\+))?[\\d]{1}[\\d]* 

的语法错误在运行时:

Pattern.compile("(?<=(00|\\+))?[\\d]{1}[\\d]*") 

在我用

(?<=(00|\+))?[\d]{1}[\d]* 

我想匹配的手机查找有或没有+或00的数字。但那不是重点,因为我在位置13得到一个语法错误。我没有得到错误,如果我摆脱了第二个“?”

Pattern.compile("(?<=(00|\\+))[\\d]{1}[\\d]*") 

请考虑,与其1有时我需要使用更多数量反正问题是关于语法错误

+3

您能否提供错误讯息? – hsz 2012-07-12 11:54:39

+0

你想匹配什么字符串? – arnep 2012-07-12 11:55:34

+1

不知道你在做什么,但你的正则表达式看起来像是等同于'\ d +'。 – nhahtdh 2012-07-12 11:55:48

回答

1

如果您的数据看起来像00ddddd+ddddd其中d是你想要得到@Bergi的正则表达式(?<=00|\\+)\\d+会做的伎俩位。但是,如果你的数据有时没有要忽略像ddddd那么你可能应该使用组机制像

String[] data={"+123456","0","123456"}; 
Pattern p=Pattern.compile("(?:00|\\+)?(\\d+)"); 
Matcher m=null; 
for (String s:data){ 
    m=p.matcher(s); 
    if(m.find()) 
     System.out.println(m.group(1)); 
} 

输出

123456 
123456 
123456 
+0

如果你用你的regexp替换你的regexp怎么样?你有语法错误吗? – kingston 2012-07-12 12:34:28

+0

不,我没有得到任何错误与你的正则表达式 – Pshemo 2012-07-12 12:42:52

+0

你确定你检查了确切的模式?我在第13个位置出现语法错误。 – kingston 2012-08-06 12:30:48

0

你可能会缩短你的正则表达式了很多。当内部只有一个类时,不需要字符类 - 只需使用\d即可。而{1}也是无用的。此外,您可以使用+来匹配“一个或多个”(它是{1,}的简称)。接下来应该不需要额外的分组。

最后,为什么lookbehind可选(与?)?如果你不需要它,就把它丢掉。这甚至可能是你的模式语法错误的来源 - 查找一定不能是可选的。

试试这个:

/(?<=00|\+)\d+/ 

的Java:

"(?<=00|\\+)\\d+" 
+0

嗨。谢谢。还有其他原因为什么我需要这样做。我仍然没有找到为什么我得到的语法错误 – kingston 2012-07-12 12:26:43

+0

所以,语法错误的位置是“?”让你的lookbehind可选? – Bergi 2012-07-12 12:55:58

+0

是的,但它在eclipse的find中工作正常 – kingston 2012-07-13 10:23:49

0

这里的任何部分是对我工作的例子:

public static void main(String[] args) { 
     Pattern pattern = Pattern.compile("(?<=00|\\+)(\\d+)"); 
     Matcher matcher = pattern.matcher("+1123456"); 
     if (matcher.find()) { 
      System.out.println(matcher.group(1)); 
     } 
    }