Поведение | символ в регулярном выражении - PullRequest
2 голосов
/ 29 марта 2012

Это моя строка

String s = "asadsdas357902||190||RUE RACHELLE||ST|||LES CÈDRES|J7T1J9|QC";

Я разделил ее на

String a[] = s.split(s, i);

вывод: i = 0

        |   |   1   9   0   |   |   R   U   E       R   A   C   H   E   L   L   E   |   |   S   T   |   |   |   L   E   S       C   È   D   R   E   S   |   J   7   T   1   J   9   |   Q   C   

Первые два индекса массива пустыТогда каждый индекс имеет один символ.

Когда i = 1, выводом является вся исходная строка

asadsdas357902||190||RUE RACHELLE||ST|||LES CÈDRES|J7T1J9|QC

, когда i = 2, выводом является

    ||190||RUE RACHELLE||ST|||LES CÈDRES|J7T1J9|QC  

первый индекс массива пуст, а второй содержит подстроку из первого | символа

, когда i = 3, вывод равен

        ||190||RUE RACHELLE||ST|||LES CÈDRES|J7T1J9|QC

первые два индекса пусты и последнийindex имеет ту же подстроку, что и для i = 2

, когда i = 4, выходные данные равны

        |   |190||RUE RACHELLE||ST|||LES CÈDRES|J7T1J9|QC   

первые два индекса пусты, следующий содержит канал и последний - остальные

когда i = 5, вывод равен

        |   |   190||RUE RACHELLE||ST|||LES CÈDRES|J7T1J9|QC    

первые два пустых, следующие два символа канала и последний оставшийся.

при увеличении значения i вывод

first two indexes empty
next all indexes except last contains one character each
last index contains the remaining string

Мои вопросы

  1. Почему он не учитывает первое слово перед первым символом канала?
  2. Почему он делает первые два индекса пустыми для каждогозначение i, кроме 1?
  3. Шаблон - та же самая строка здесь, так что здесь соответствует и как выходы?

И еще одна вещь, если я заменю pipe символ с любым другим символом, например @ или!или% , вывод составляет

array length is 2 with both indexes has empty strings. this is for i>=2

для i = 0

the array length is also 0

для i = 1

the array length is 1 containing the whole string.

Принимает ли pipe символ как специальный символ регулярного выражения?

Любая помощь заметна.

Ответы [ 3 ]

4 голосов
/ 29 марта 2012

split метод принимает регулярное выражение в качестве входного параметра. Теперь регулярное выражение в вашем случае asadsdas357902||190||RUE RACHELLE||ST|||LES CÈDRES|J7T1J9|QC и второй параметр i - это число раз, когда применяется операция разделения. Это объяснение вашего регулярного выражения

                         // Match either the regular expression below (attempting the next alternative only if this one fails)
   "asadsdas357902" +       // Match the characters “asadsdas357902” literally
"|" +                    // Or match regular expression number 2 below (attempting the next alternative only if this one fails)
   "|" +                    // Empty alternative effectively truncates the regex at this point because it will always find a zero-width match
                         // Or match regular expression number 3 below (attempting the next alternative only if this one fails)
   "190" +                  // Match the characters “190” literally
"|" +                    // Or match regular expression number 4 below (attempting the next alternative only if this one fails)
   "|" +                    // Empty alternative effectively truncates the regex at this point because it will always find a zero-width match
                         // Or match regular expression number 5 below (attempting the next alternative only if this one fails)
   "RUE\\ RACHELLE" +        // Match the characters “RUE RACHELLE” literally
"|" +                    // Or match regular expression number 6 below (attempting the next alternative only if this one fails)
   "|" +                    // Empty alternative effectively truncates the regex at this point because it will always find a zero-width match
                         // Or match regular expression number 7 below (attempting the next alternative only if this one fails)
   "ST" +                   // Match the characters “ST” literally
"|" +                    // Or match regular expression number 8 below (attempting the next alternative only if this one fails)
   "|" +                    // Empty alternative effectively truncates the regex at this point because it will always find a zero-width match
                         // Or match regular expression number 9 below (attempting the next alternative only if this one fails)
   "|" +                    // Empty alternative effectively truncates the regex at this point because it will always find a zero-width match
                         // Or match regular expression number 10 below (attempting the next alternative only if this one fails)
   "LES\\ CÈDRES" +          // Match the characters “LES CÈDRES” literally
"|" +                    // Or match regular expression number 11 below (attempting the next alternative only if this one fails)
   "J7T1J9" +               // Match the characters “J7T1J9” literally
"|" +                    // Or match regular expression number 12 below (the entire match attempt fails if this one fails to match)
   "QC"                     // Match the characters “QC” literally

Итак, ваше регулярное выражение в некотором смысле эквивалентно asadsdas357902|, потому что регулярное выражение, которое следует за ним, никогда не проверяется. См. Документацию метода split здесь String # split

Этот код даст вам тот же вывод

private static void splitWithPipe() {
    String s = "asadsdas357902||190||RUE RACHELLE||ST|||LES CÈDRES|J7T1J9|QC";
    for (int i = 0; i < 10; i++) {
        String a[] = s.split("asadsdas357902|", i); 
        System.out.println(Arrays.toString(a));
    }
}
2 голосов
/ 29 марта 2012

| действительно специальный символ в регулярных выражениях. Это означает «либо материал слева от меня, либо материал справа от меня», поэтому ab|cd соответствует либо ab, либо cd. Это может быть дополнительно ограничено скобками.

Если вы хотите разделить регулярное выражение на |, тогда вам нужно регулярное выражение \|, которое в Java нужно записать как "\\|" в строке.

0 голосов
/ 29 марта 2012

В регулярных выражениях вам не нужен двойной символ | - это просто запутает вещи.Возможно, вы захотите посетить сайт с учебными пособиями по регулярным выражениям и использовать веб-сайт тестер регулярных выражений

...