Pattern.COMMENTS всегда приводит к сбою Matcher.find - PullRequest
2 голосов
/ 03 февраля 2012

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

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {

        String regex = "\\{user_id : [0-9]+\\}";
        String string = "{user_id : 0}";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(string);

        if (matcher.find())
            System.out.println("Success.");
        else
            System.out.println("Failure.");
    }
}

Однако я хочу, чтобы пробел не имел значения, поэтому следующий текст также должен быть успешным.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {

        String regex = "\\{user_id:[0-9]+\\}";
        String string = "{user_id : 0}";

        Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);
        Matcher matcher = pattern.matcher(string);

        if (matcher.find())
            System.out.println("Success.");
        else
            System.out.println("Failure.");
    }
}

Предполагается, что флаг Pattern.COMMENTS разрешает пробелы, но приводит к печати с ошибками.Это даже приводит к тому, что Failure печатается, если строки в точности эквивалентны, включая пробелы, как в первом примере.Например,

import java.util.regex.Matcher;import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {

        String regex = "\\{user_id : [0-9]+\\}";
        String string = "{user_id : 0}";

        Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);
        Matcher matcher = pattern.matcher(string);

        if (matcher.find())
            System.out.println("Success.");
        else
            System.out.println("Failure.");
    }
}

Отказ печати. ​​

Почему это происходит и как заставить шаблон игнорировать пробелы?

1 Ответ

9 голосов
/ 03 февраля 2012

На вашей стороне недоразумение.Pattern.COMMENTS позволит вам добавить дополнительные пробелы в ваше регулярное выражение, чтобы улучшить читаемость регулярного выражения, но этот пробел НЕ будет совпадать в строке.

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

Пример

С помощью Pattern.COMMENTS вы можете поместить пробел в свое регулярное выражение, как это

String regex = "\\{ user_id: [0-9]+ \\}";

чтобы улучшить readablitiy, но он не будет соответствовать строке

String string = "{user_id : 0}";

, потому что вы не определили пробелы в строке, поэтому, если вы хотите использовать Pattern.COMMENTS, вам нужно обработать пробелЕсли вы хотите, чтобы совпадение было специальным, вы можете его избежать

String regex = "\\{ user_id\\ :\\  [0-9]+ \\}";

или использовать класс пробелов

String regex = "\\{ user_id \\s:\\s [0-9]+ \\}";
...