2014-01-04 4 views
0

Это documentation состояния это о Звездочка квантора:Регулярного выражения Звездочки квантор

Матчи предыдущего символа 0 или более раз.

Он работает в чем-то вроде этого:

var regex = /<[A-Za-z][A-Za-z0-9]*>/; 
var str = "<html>"; 
console.log(str.match(regex)); 

Результат вышеперечисленное: <html>

Но когда попробовал на следующий код, чтобы получить все «R» с в строке ниже, он возвращает только первый «r». Почему это?

var regex = /r*/; 
var str = "rodriguez"; 
console.log(str.match(regex)); 

Почему, в первом примере, это вызывает «предыдущий» символ/маркер должен быть повторен «0 или более раз», но не во втором примере?

ответ

2
var regex = /r*/; 
var str = "rodriguez"; 

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

Затем двигатель регулярного выражения пытается сопоставить другой r, но следующий символ o, поэтому он останавливается там.

Без глобального флага g (используется как так var regex = /r*/g;), двигатель регулярных выражений перестанет искать больше совпадений после выполнения регулярного выражения.

Попробуйте использовать:

var regex = /a*/; 
var str = "cabbage"; 

Матч будет пустая строка, несмотря на наличие a сек в строке! Это связано с тем, что во-первых, двигатель регулярных выражений пытается найти a в cabbage слева направо, но первый символ - c. Поскольку это не соответствует, регулярное выражение пытается совместить 0 раз. Таким образом, выполняется регулярное выражение, и совпадение заканчивается здесь.

Возможно, стоит упомянуть, что только * является жадным, что означает, что он сначала попытается сопоставить как можно больше (часть «или больше» из описания), прежде чем пытаться сопоставить 0 раз.

Чтобы получить все r от rodriguez, вам потребуется глобальный флаг, как уже упоминалось ранее:

var regex = /r*/g; 
var str = "rodriguez"; 

Вы получите все r, плюс все пустые строки внутри, так * также не соответствует «ничего» ,

+0

Спасибо, я понимаю логику этого. –

+0

@robertrocha Добро пожаловать :) – Jerry

1

Используйте глобальный переключатель, чтобы соответствовать 1 или более г в любом месте строки:

var regex = /r+/g; 

В вашем другом регулярном выражении:

var regex = /<[A-Za-z][A-Za-z0-9]*>/; 

Вы сопрягая буквальный < сопровождаемой буквы с последующей 0 или больше буквы или цифры, и она будет идеально соответствовать <html>

Но если у вас есть вход <foo>:<bar>:<abc>, тогда он будет просто матч <foo> не другие сегменты. Чтобы соответствовать всем сегментам, вам необходимо использовать /<[A-Za-z][A-Za-z0-9]*>/g с глобальным коммутатором.

+0

Спасибо. Можете ли вы объяснить «почему», кроме «как», который вы предоставили. –

+1

'*' означает _ "продолжать сопоставлять, пока это не так" _, где, когда флаг 'g'lobal означает _, после того, как мы нашли совпадение, начните искать второе совпадение, затем третье и т. Д. _ _ –

+0

@robertrocha: уточните мой обновленный ответ для объяснения. – anubhava

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