模式语法错误

时间:2012-07-12 11:53:09

标签: java regex

以下正则表达式在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 个答案:

答案 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));
        }
    }