Приоритет в регулярных выражениях
Я пишу код Java для разделения строки на массив строк. Сначала я разбил эту строку, используя шаблон регулярных выражений "\\,\\,|\\,"
а потом я разделить с помощью шаблона "\\,|\\,\\,"
, Почему есть разница между выводом первого и выводом второго?
public class Test2 {
public static void main(String[] args){
String regex1 = "\\,\\,|\\,";
String regex2 = "\\,|\\,\\,";
String a = "20140608,FT141590Z0LL,0608103611018634TCKJ3301000000018667,3000054789,IDR1742630000001,80507,1000,6012,TCKJ3301,6.00E+12,ID0010015,WADORI PURWANTO,,3000054789";
String ss[] = a.split(regex1);
int index = 0;
for(String m : ss){
System.out.println((index++)+ ": "+m+"|");
}
}
}
Вывод при использовании regex1
:
0: 20140608|
1: FT141590Z0LL|
2: 0608103611018634TCKJ3301000000018667|
3: 3000054789|
4: IDR1742630000001|
5: 80507|
6: 1000|
7: 6012|
8: TCKJ3301|
9: 6.00E+12|
10: ID0010015|
11: WADORI PURWANTO|
12: 3000054789|
И при использовании regex2
:
0: 20140608|
1: FT141590Z0LL|
2: 0608103611018634TCKJ3301000000018667|
3: 3000054789|
4: IDR1742630000001|
5: 80507|
6: 1000|
7: 6012|
8: TCKJ3301|
9: 6.00E+12|
10: ID0010015|
11: WADORI PURWANTO|
12: |
13: 3000054789|
Мне нужно некоторое объяснение того, как движок регулярных выражений работает в этой ситуации.
4 ответа
Как работает регулярное выражение: конечный автомат всегда читает слева направо. ,|,,
== ,
, так как это всегда будет соответствовать только первому чередованию:
http://gyazo.com/9fb73ec138449ed2489d7b66f703447d.png
,,|,
== ,,?
:
http://gyazo.com/f39e53c2fd99e9832b2c04508a988c9f.png
Тем не менее, вы должны использовать ,,?
вместо этого, поэтому нет возврата назад:
Видя два результата, кажется, что метод split пытается сначала найти первое выражение ("," для regex2, ",," для regex1) и разделить строку, а затем - второе, но после первого прохода с regex2 в строках не осталось ни одного ",". Вот почему при чтении ",," с помощью regex2 обнаруживается пустая строка.
Таким образом, чтобы ваше регулярное выражение было полезным, сначала нужно написать более сложное выражение.
Случай 1: Разделить на ,,
еще ,
Это получает только первый случай, остальные делятся на ,
,
Случай 2: Разделить на ,
еще ,,
получает все дела. Так ,,
разделяется на word
а также ,word
,
затем ,word
разделяется на " " и word
,
Он будет оцениваться слева направо. В regex1
, \\,\\,
пробуется первым, в противном случае \\,
испробован Вот почему 12-я строка не пуста, потому что \\,\\,
соответствует в этом случае. За regex2
все сопоставляется с помощью \\,
отсюда и пустая строка.