2013-11-08 4 views
0

Я подошел к строке в java, которая использует регулярные выражения. Это требует пользовательского ввода ФамилияJava Regular Expression: what is "'-"

return lastName.matches("[a-zA-z]+([ '-][a-zA-Z]+)*"); 

Я хотел бы знать, что это функция из [ «-]. Кроме того, почему нам нужны оба «+» и «*» одновременно, а ['-] [a-zA-Z] заключен в скобки?

+0

Это обычный класс символов, такой же, как '[a-zA-Z]'. Он соответствует пробелу, одной кавычке и тире. – Kevin

+0

Я предлагаю вам взглянуть на [javadoc] (http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html) 'java.util.regex.Pattern 'класс. –

ответ

4

Ваш RE является: [a-zA-z]+([ '-][a-zA-Z]+)*

Я разбить его на составные части:

  • [a-zA-Z]+

    Строка должна начинаться с любой буквы, a-z или A-Z, повторил один или больше раз (+).

  • ([ '-][a-zA-Z]+)*

    • [ '-]

    Любой одиночный символ <space>, ' или -.

    • [a-zA-Z]+

    Опять же, любое письмо, a-z или A-Z, повторяется один раз или несколько раз.

    Эта комбинация букв ('- и a-ZA-Z) может быть затем повторена ноль или более раз.

Почему [ '-]?Чтобы разрешить хипфированные имена, такие как Higgs-Boson или имена с апострофами, например O'Reilly, или имена с такими пробелами, как Van Dyke.

0

это означает, что она может быть любой из символов space' или - (пробел, цитирует тир)

- может быть сделан как \-, как это может также означать диапазон ... как a-z

2

Выражение [ '-] означает «один из ', , или -». Порядок очень важен - черта должна быть последней, иначе класс символов будет считаться диапазоном, и другие символы с кодовыми точками между пробелом и цитатой ' также будут приняты.

+ означает «одно или несколько повторений»; * означает «ноль или более повторений», ссылаясь на срок регулярного выражения, предшествующий модификатор + или *.]

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

0

Это выглядит, как будто это шаблон, чтобы соответствовать двуствольное (пробел или дефис) или I-не-знаю-что-с-называть-это имена, как O'Grady ... например:

это будет соответствовать

counter-terrorism 
De'ville 
O'Grady 
smith-jones 
smith and wesson 

Но это не будет соответствовать

jones- 
O'Learys' 
#hashtag 
Bob & Sons 
0

идея не после того, как первый [A-Za-z]+ потребляет все буквы может, матч закончится прямо здесь, если й Следующий символ - это пробел, апостроф или дефис ([ '-]). Если присутствует один из этих символов, за ним должно следовать хотя бы еще одно письмо.

У многих людей есть трудности с этим. Наивно напишите что-нибудь вроде [A-Za-z]+[ '-]?[A-Za-z]*, причем как разделитель, так и дополнительные куски букв являются необязательными. Но они не независимо опционально; если есть разделитель ([ '-]), то должен за ним следует хотя бы еще одна буква. В противном случае он обрабатывал бы строки как R'- j'-' как действительные. У вашего регулярного выражения нет этой проблемы.

Кстати, у вас есть опечатка в вашем регулярном выражении: [a-zA-z]. Вы хотите следить за этим, потому что [A-z] соответствует всем прописным и строчным буквам, поэтому он будет работать корректно, пока входы будут действительны. Но он также соответствует нескольким небуквенным символам, кодовые точки которых находятся между Z и a. И очень мало IDE или инструментов регулярных выражений поймают эту ошибку.