идея не после того, как первый [A-Za-z]+
потребляет все буквы может, матч закончится прямо здесь, если й Следующий символ - это пробел, апостроф или дефис ([ '-]
). Если присутствует один из этих символов, за ним должно следовать хотя бы еще одно письмо.
У многих людей есть трудности с этим. Наивно напишите что-нибудь вроде [A-Za-z]+[ '-]?[A-Za-z]*
, причем как разделитель, так и дополнительные куски букв являются необязательными. Но они не независимо опционально; если есть разделитель ([ '-]
), то должен за ним следует хотя бы еще одна буква. В противном случае он обрабатывал бы строки как R'- j'-'
как действительные. У вашего регулярного выражения нет этой проблемы.
Кстати, у вас есть опечатка в вашем регулярном выражении: [a-zA-z]
. Вы хотите следить за этим, потому что [A-z]
соответствует всем прописным и строчным буквам, поэтому он будет работать корректно, пока входы будут действительны. Но он также соответствует нескольким небуквенным символам, кодовые точки которых находятся между Z
и a
. И очень мало IDE или инструментов регулярных выражений поймают эту ошибку.
Это обычный класс символов, такой же, как '[a-zA-Z]'. Он соответствует пробелу, одной кавычке и тире. – Kevin
Я предлагаю вам взглянуть на [javadoc] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html) 'java.util.regex.Pattern 'класс. –