класс символов регулярного выражения - PullRequest
0 голосов
/ 24 июня 2018
String a = "77*b+7-77/98+6";
String b[] = a.split("[*+-/]"); // works fine
b[] = a.split("[+/-  *]"); // gives pattern syntax exception because of   " * "
b[] = a.split("[*/+-]"); // works fine
b[] = a.split("[-*]"); // works fine

Пожалуйста, помогите мне разобраться в этом.

1 Ответ

0 голосов
/ 24 июня 2018

В квадратных скобках Regex [] обозначает класс символов . Класс символов может иметь два символа, разделенных дефисом a-z для обозначения диапазона символов.

Это означает, что если используется дефис и любой конец диапазона недопустим, это недопустимый шаблон. В этом случае этот дефис должен быть экранирован, \\- в Java.

Но, если дефис используется либо в начале , либо конце диапазона символов, то дефис не рассматривается как метасимвол - потому что он не может быть диапазоном. Таким образом, ваши другие шаблоны работают, потому что дефис эффективно экранирован.

b[] = a.split("[*/+-]"); // works fine
                   ^ at the end
b[] = a.split("[-*]"); // works fine
                ^ at the start

Первое выражение имеет +-/, что является допустимым диапазоном от + до / в наборе символов ASCII , что эквивалентно буквенным символам +,-./.

Выражение с ошибкой имеет /-, то есть диапазон от / до SPACE. SPACE - это символ 32, а / - это символ 47, поэтому ваш диапазон равен 47-32, диапазон равен в обратном направлении .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...