使用替换时,Java正则表达式优先

时间:2012-04-05 15:33:38

标签: java regex

给定一组由OR(即|)分隔的java正则表达式模式,模式将遵循任何特定的优先级。

示例代码: -

    List<String> columnValues = new ArrayList<String>

    String []columnPatterns = new String[] { "(\\S\\s?)+", "(\\S\\s?)+",
                "(\\d+,?)+\\.\\d+ | \\d+:\\d+", "(\\S\\s?)+",
                "-?\\$?(\\d+,?)+\\.\\d+" };

    String searchString = "Text1            This is Text 2                                          129.80";

    int findFrom = 0;
    int columnIndex = 0;
    List<String> columnValues = new ArrayList<String>();
    for (String pattern : columnPatterns) {
        Pattern p = Pattern.compile(pattern);
        Matcher m = p.matcher(searchString);
        if (m.find(findFrom)) {
            columnValues.add(columnIndex++,
                    searchString.substring(m.start(), m.end()).trim());
            findFrom = m.end();
        }
    }

    for (String value : columnValues) {
        System.out.println("<" + value + ">");
    }

以上代码产生以下结果: -

    <Text1>
    <This is Text 2>
    <129.80>

但是如果我将columnPatterns数组中索引位置2的模式从“(\ _ + +,+)+ \。\ d + | \ _ + +:\ d +”更改为“(\ d +,?)+ \。\ d + | \ d +:\ d + | \ d +“如下图所示: -

    columnPatterns = new String[] { "(\\S\\s?)+", "(\\S\\s?)+",
                "(\\d+,?)+\\.\\d+ | \\d+:\\d+ | \\d+", "(\\S\\s?)+",
                "-?\\$?(\\d+,?)+\\.\\d+" };

我得到以下结果: -

   <Text1>
   <This is Text 2>
   <129>
   <.80>

这是否意味着存在某种隐式优先级应用或者是否存在其他原因以及可能是解决方案/解决此问题的原因?

编辑: 此外,为什么代码的行为方式如此。

1 个答案:

答案 0 :(得分:3)

  

给定一组由OR(即|)分隔的java正则表达式模式,是否有任何特定的优先级,模式将遵循

从左到右。在字符串中的每个位置,将按顺序测试每个交替,首先匹配的那个将是最终匹配(除非稍后回溯)。

在你的情况下,最后一次交替将首先匹配,因为你在它的开头有一个空格,因此它可以匹配先前的交替没有。

例如,匹配字符串\d| \d上的模式foo 7,第二个替换将首先匹配字符串中的索引3。第一个在该位置无法匹配,只能在索引4处匹配。