正则表达式给出意外匹配

时间:2012-01-12 11:36:46

标签: java regex

我一直在使用http://www.regexplanet.com/advanced/java/index.html来测试我写过的正则表达式。

正则表达式为:\ A [\ d +( - \ d +){0,1} \ | \ d + \ | \ d + \ | [YN] {1}](,[\ d +( - \ d +) {0,1} \ | \ d + \ | \ d + \ | [YN] {1}])* \ž

我正在尝试匹配'[30-41 | 2 | 21 | Y]'或'[15-23 | 45 | 12 | Y],[15 | 42 | 6 | Y]'形式的字符串等

当在该站点上进行测试时,正则表达式似乎工作得很好但是当我在我自己的java代码中使用它时(见下文),它给了我意想不到的匹配(我在代码下方粘贴了控制台输出)。有谁知道我在这里做错了什么?

编辑:正如stema所指出的,在创建Pattern和Matcher时,我输入的字符串和模式的顺序错误。我现在已经交换了这一轮,但我现在正在'找不到匹配'。

public static void testRegex(String inputString){

    String regex = "\\A\\[\\d+(\\-\\d+){0,1}\\|\\d+\\|\\d+\\|[YN]{1}\\](,\\[\\d+(\\-\\d+){0,1}\\|\\d+\\|\\d+\\|[YN]{1}\\])*\\z";

    Pattern pattern = Pattern.compile(inputString);

    Matcher matcher = pattern.matcher(regex);

    boolean found = false;

    while(matcher.find()){
        System.out.println("Found at :");
        System.out.println("start - " + matcher.start());
        System.out.println(", end - " + matcher.end() + ". ");
        found = true;
    }

    if(!found){
        System.out.println("no match found");
    }
}


public static void main(String[] args){
    testRegex("[61|12|6]");
}    

我得到的控制台输出:

发现于: 开始 - 17 ,结束 - 18。 发现于: 开始 - 20 ,结束 - 21。 发现于: 开始 - 25 ,结束 - 26。 发现于: 开始 - 30 ,结束 - 31。 发现于: 开始 - 36 ,结束 - 37。 发现于: 开始 - 57 ,结束 - 58。 发现于: 开始 - 60 ,结束 - 61。 发现于: 开始 - 65 ,结束 - 66。 发现于: 开始 - 70 ,结束 - 71。 发现于: 开始 - 76 ,结束 - 77。

1 个答案:

答案 0 :(得分:3)

您的代码错误

Pattern pattern = Pattern.compile(inputString);
Matcher matcher = pattern.matcher(regex);

你需要编译模式而不是输入字符串,这应该更好:

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(inputString);

使用“模式”[61|12|6],您会找到“1”和“|”在正则表达式。

<强>更新

您没有在正则表达式中覆盖输入字符串模式([61|12|6]),因为您为\\|[YN]测试的第四部分不是可选的。试试这个:

\\A\\[\\d+(\\-\\d+)?\\|\\d+\\|\\d+(?:\\|[YN])?\\](,\\[\\d+(\\-\\d+)?\\|\\d+\\|\\d+(?:\\|[YN])?\\])*\\z

here on Regexr