Приоритет в регулярных выражениях

Я пишу код 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


Тем не менее, вы должны использовать ,,? вместо этого, поэтому нет возврата назад:

http://gyazo.com/d06516c7d2cdf5dd4c1e65886dbaf281.png

Видя два результата, кажется, что метод split пытается сначала найти первое выражение ("," для regex2, ",," для regex1) и разделить строку, а затем - второе, но после первого прохода с regex2 в строках не осталось ни одного ",". Вот почему при чтении ",," с помощью regex2 обнаруживается пустая строка.

Таким образом, чтобы ваше регулярное выражение было полезным, сначала нужно написать более сложное выражение.

Случай 1: Разделить на ,, еще ,
Это получает только первый случай, остальные делятся на ,,

Случай 2: Разделить на , еще ,,
получает все дела. Так ,, разделяется на word а также ,word,
затем ,word разделяется на " " и word,

Он будет оцениваться слева направо. В regex1, \\,\\, пробуется первым, в противном случае \\, испробован Вот почему 12-я строка не пуста, потому что \\,\\, соответствует в этом случае. За regex2все сопоставляется с помощью \\,отсюда и пустая строка.

Другие вопросы по тегам