以下正则表达式在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,我需要使用更大的数字,无论如何问题是关于语法错误
答案 0 :(得分:1)
如果您的数据看起来像00ddddd
或+ddddd
,其中d是数字,那么您希望得到@Bergi的正则表达式(?<=00|\\+)\\d+
就行了。但是,如果您的数据有时没有任何您想要忽略的部分,例如ddddd
,那么您可能应该使用像
String[] data={"+123456","00123456","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
答案 1 :(得分:0)
你可能会缩短你的正则表达式。当内部只有一个类时,不需要字符类 - 只需使用\d
。 {1}
也是无用的。此外,您可以使用+
来匹配“一个或多个”(它是{1,}
的缩写)。接下来,不需要在lookbehind中添加额外的分组。
最后,为什么lookbehind可选(使用?
)?如果你不需要它就离开它。这甚至可能是模式语法错误的根源 - 外观不能是可选的。
试试这个:
/(?<=00|\+)\d+/
爪哇:
"(?<=00|\\+)\\d+"
答案 2 :(得分: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));
}
}