Почему этот шаблон не компилируется:
Pattern.compile("(?x)[ ]\\b");
Ошибка
ERROR java.util.regex.PatternSyntaxException:
Illegal/unsupported escape sequence near index 8
(?x)[ ]\b
^
at java_util_regex_Pattern$compile.call (Unknown Source)
В то время как следующие эквивалентные работают?
Pattern.compile("(?x)\\ \\b");
Pattern.compile("[ ]\\b");
Pattern.compile(" \\b");
Это ошибка в компиляторе регулярных выражений Java, или я что-то упустил? Мне нравится использовать [ ]
в подробном регулярном выражении вместо обратной косой черты-обратной косой черты-пространства, потому что это избавляет от некоторого визуального шума. Но видимо они не одинаковые!
PS: эта проблема не касается обратной косой черты. Речь идет об экранировании пробелов в подробном регулярном выражении с использованием класса символов, содержащего один пробел [ ]
вместо использования обратной косой черты.
Каким-то образом комбинация подробных регулярных выражений (?x)
и класса символов, содержащего один пробел [ ]
, сбивает компилятор и заставляет его не распознавать переход границы слова \b
Протестировано с Java до 1.8.0_151
x
(включенный(?x)
OP) приводит к игнорированию пробелов и комментариев; поэтому(?x)a b
эквивалентноab
, тогда как(?x)a\ b
эквивалентноa b
. Как объясняет Сокови в своем ответе, проблема в том, что ОП ожидал, что(?x)a[ ]b
будет эквивалентенa[ ]b
(то естьa b
), хотя на самом деле он эквивалентенa[]b
(что неверно). - person ruakh   schedule 14.03.2018[ ]
является допустимым способом избежать пробелов в подробном регулярном выражении, см., например, Perl:echo 'a b' | perl -lne 'print if /a[ ]b/x'
или libpcre:echo 'a b' | pcregrep '(?x)a[ ]b'
- person Tobia   schedule 14.03.2018