RegEx [A-Za-z!,? ._ '@] + возвращает 0 совпадений, а [!,? ._' @] + возвращает 10? - PullRequest
0 голосов
/ 13 декабря 2018
String s = "He is a very very good boy, isn't he?";
Pattern pattern = Pattern.compile(("[A-Za-z !,?._'@]+"));
String[] split = pattern.split(s); 
System.out.println(split.length);

Вопрос 1: RegEx [A-Za-z !,?._'@]+ возвращает 0 подстрок, а [ !,?._'@]+ возвращает 10. Пожалуйста, объясните, как удаление A-Za-z из шаблона привело к совпадениям?

Вопрос 2: RegEx [ !,?._'@]+возвращает 10 подстрок, в то время как [ !,?._'@] возвращает 11. Использование + и не использование + дает разные ответы, пожалуйста, объясните.Я понимаю, что + соответствует одному или нескольким.Когда я использую разделенный массив, я вижу, что RegEx со знаком + рассматривает "," (запятая и пробел после мальчика) как один шаблон.Но без знака + он рассматривает "," как 2 отдельных шаблона.Означает ли это, что символ + используется для соответствия одной или нескольким комбинациям шаблона регулярного выражения?

Пожалуйста, объясните 2 вопроса выше.

1 Ответ

0 голосов
/ 13 декабря 2018

Я думаю, вы неправильно понимаете, как работает split - он ищет выражения в строке, которые соответствуют шаблону, и разбивает строку вокруг них, удаляя шаблон в процессе.См. Руководство .

. В вашем первом примере регулярное выражение [A-Za-z !,?._'@]+ соответствует каждому символу в строке, поэтому split ничего не возвращает, поскольку по обе стороны от шаблона нет символов.

Во втором примере регулярное выражение [ !,?._'@]+ возвращает 10 подстрок, поскольку в строке есть 9 вхождений шаблона: (space), (space), (space), (space), (space),(space), ,(space), ' и (space) (последний ? не генерирует подстроку, так как после нее нет символов).Выходные подстроки: He, is, a, very, very, good, boy, isn, t, he.

Наконец, в третьем примере ([ !,?._'@]) разница состоит в том, что ,(space), который был сопоставлен как один разделитель во втором примере (из-за + в регулярном выражении), теперь сопоставляется как два: ,и (space).Это приводит к дополнительной пустой подстроке в выходных данных. Выходные подстроки: He, is, a, very, very, good, boy, (empty), isn, t, he.

Я создал демо для rextester , которое выводит каждую из подстрок, чтобы вы могли увидеть это в действии.

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