Каковы недостатки сканирования с регулярными выражениями в Java

java regex java.util.scanner

84 просмотра

2 ответа

19 Репутация автора

Я знаю, что в дополнение к сканированию по заранее заданным primitiveтипам я также могу сканировать свои собственные пользовательские шаблоны, что полезно при сканировании более сложных данных. Я говорю о Scanner.next(String pattern)методе. Тем не менее, в книге, которую я читал о Java, есть параграф, который говорит

«Существует одно предупреждение при сканировании с использованием регулярных выражений. Шаблон сопоставляется только со следующим входным токеном, поэтому, если ваш шаблон содержит разделитель, он никогда не будет сопоставлен».

Я не очень понимаю, что это значит и в каких ситуациях этот тип сканирования не применим

Автор: Martin Kotevski Источник Размещён: 18.07.2016 09:58

Ответы (2)


2 плюса

60054 Репутация автора

Решение

Представьте, что у вас есть запятая ,в качестве разделителя. Теперь каким-то образом (может быть, это было предоставлено кем-то другим) вы придумали шаблон ab,cd. Поскольку шаблон содержит разделитель, сканер будет пытаться сопоставить ab,cdсначала с, abа затем с cd, в результате чего совпадения не будет.

Обратите внимание, что это предостережение , и это не обязательно то, с чем вы легко столкнетесь.

Автор: Kayaman Размещён: 18.07.2016 10:04

0 плюса

7359 Репутация автора

Говоря об оригинальном примере, приведенном в книге «Мышление на Java», эта программа:

String threatData =
        "58.27.82.161@02/10/2005\n" +
        "204.45.234.40@02/11/2005\n" +
        "58.27.82.161@02/11/2005\n" +
        "58.27.82.161@02/12/2005\n" +
        "58.27.82.161@02/12/2005\n" +
        "[Next log section with different data format]";

Scanner sc = new Scanner(threatData);
Pattern pattern = Pattern.compile("(\\d+([.]\\d+){3})@" + "(\\d{2}/\\d{2}/\\d{4})");
                                             ///     ^
while(sc.hasNext(pattern)) {
    System.out.println(sc.next(pattern));  
    MatchResult matchResult = sc.match();
    System.out.println("Threat from " + matchResult.group(1) + " on " + matchResult.group(3));
}

правильно печатает нужный вывод. Но, когда вы делаете небольшое изменение к нему, заменив @в threatData с пробелами ' 'и @в шаблоне с \\s, вы будете наблюдать , что сканер не может соответствовать шаблону , поскольку он содержит разделитель по умолчанию.

String threatData =
        "58.27.82.161 02/10/2005\n" +
        "204.45.234.40 02/11/2005\n" +
        "58.27.82.161 02/11/2005\n" +
        "58.27.82.161 02/12/2005\n" +
        "58.27.82.161 02/12/2005\n" +
        "[Next log section with different data format]";

Scanner sc = new Scanner(threatData);
Pattern pattern = Pattern.compile("(\\d+([.]\\d+){3})\\s" + "(\\d{2}/\\d{2}/\\d{4})");
                                                //    ^^
Автор: Saurav Sahu Размещён: 17.09.2018 04:05
Вопросы из категории :
32x32