2013-09-11 2 views
3
^([A-Z][A-Za-z.'\- ]+) ([A-Z][A-Za-z.'\-]+)$ 

для Дэвида Тейлора Gator будет захватить «Дэвид Тейлор», как в первом матче и «Gator» в качестве второго матча. Я не понимаю, почему движок регулярных выражений делает это. Не должна ли она быть жадным и захватить всю строку 3 слов, используя только первую группу:Почему это регулярное выражение, захватывая как первое и второе имя

^([A-Z][A-Za-z.'\- ]+) 

или она делает некоторые назад отслеживания для того, чтобы произвести матч?

+1

В первой части есть пробел. Это проблема. –

+1

Если первая часть захватила все, после этого не было бы никакого обязательного места и одного или нескольких символов. –

+1

Это также откат. Так что это началось бы с захвата всего. Затем отступите, пока он не удовлетворится. –

ответ

2

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

^([A-Z][A-Za-z.'\- ]+) ([A-Z][A-Za-z.'\-]+)$ 
*      *     * 

отмеченные звездочкой части должны быть согласованы. Каждое совпадение должно содержать начало строки, конец строки и пробел. Теперь рассмотрим, как совпадают другие части, и давайте назовем [A-Z][A-Za-z.'\-] именами символов.

^([A-Z][A-Za-z.'\- ]+) ([A-Z][A-Za-z.'\-]+)$ 
    ------------------- ------------------ 
      1      2 

1 может соответствовать любой последовательности символов имени и пространства, до тех пор, пока есть по крайней мере один из них. 2 будет соответствовать любому из символов имени. Смотрели на этом уровне абстракции, регулярное выражение

{beginning of line} 
{one or more (name characters or space)} 
{space} 
{one or more (name characters)} 
{end of line} 

Единственный способ, которым это регулярное выражение может соответствовать

David Taylor Gator 

как

{beginning of line}     ^
{one or more (name characters or space)} "David Taylor" 
{space}         " " 
{one or more (name characters)}   "Gator" 
{end of line}       $ 

Другая вещь, которую можно было бы рассмотреть , поскольку в строке всего два пробела:

{beginning of line}     ^
{one or more (name characters or space)} "David" 
{space}         " " 
{one or more (name characters)}   "Taylor Gator" XXX 
{end of line}       $ 

но это не совпадение, потому что у «Тейлора Гатора» есть пробел, но {one or more (name characters)} не позволяет пробел.

+0

Спасибо за объяснение, но когда вы упоминаете «или пробел», вы имеете в виду ТОЛЬКО ОДИНОЧНОЕ ПРОСТРАНСТВО или «одно или несколько пробелов»? Оставляет ли пространство в наборе символов «это пространство можно повторить только один раз»? Потому что, когда вы применяете оператор повтора +, я думаю, что это относится ко всем символам набора символов, включая пробел. Поэтому я думаю, что ваше объяснение с круглой скобкой в ​​строке 2 должно быть «одним или несколькими символами имени или одним или несколькими пробелами». Разве это не просто символ? – daremkd

+0

Его следует читать как «один или несколько (имена или пробелы)», а не «(один или несколько символов имени) или пробел», и я обновил свой ответ, чтобы удалить эту потенциальную двусмысленность. –

+0

Спасибо. Одна вещь, которую я не понимаю, когда вы упоминаете «единственный способ, которым это регулярное выражение может соответствовать ___, как ...», и упомянуть «{один или несколько (имена символов или пробелы)}« Дэвид Тейлор », а затем {пробел }: «Мы рассматриваем жадность здесь? Потому что, когда у меня есть только первая часть выражения "([A-Z] [A-Za-z. '\ -] +)" без второго, она по-прежнему соответствует "David Taylor Gator". Я пытаюсь понять, как обрабатывает этот процесс в regex engine, похоже, использует обратное отслеживание, но не уверен, как он это делает ... – daremkd

0

Попробуйте это. Но для этого потребуется строка с двумя именами ... если вы хотите получить первые 2 имени - затем удалите $ с конца.

^([A-Z][A-Za-z.'\-]+) ([A-Z][A-Za-z.'\-]+)$ 

Первая группа захвата имела пространство, которое заставляет его захватывать первые 2 слова.

+1

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

Смежные вопросы