1

给定一组由 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+ :\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>

这是否意味着应用了某种隐式优先级,或者这背后是否有其他原因,以及这种行为的解决方案/解决方法是什么?

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

4

1 回答 1

3

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

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

在您的情况下,最后一个替代将首先匹配,因为您在它的开头有一个空格,因此当之前的替代不匹配时它可以匹配。

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

于 2012-04-05T15:40:57.610 回答