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>
これは、何らかの暗黙の優先順位が適用されていることを意味していますか、それともこの背後に他の理由があり、この動作の解決策/回避策は何ですか?
編集:また、なぜコードがそのように動作するのですか。