2015-07-13 3 views
1

У меня есть довольно простое выражение регулярного выражения,String.prototype.match различие между Chrome/Safari и FireFox

"lang-bash".match("lang-([a-z]+)", "gi") 

И последняя Chrome (43-иш) я получаю ожидаемое поведение ["lang-bash", "bash"]. Когда я пытаюсь сделать то же самое на последнем FireFox (39 или 41a), я получаю ["lang-bash"]. Я также пробовал это в Safari (8.0.7), и он имеет ожидаемый результат от ["lang-bash", "bash"].

Так что это может быть ошибка в FireFox, на которую я могу подать заявку, но я ожидаю, что это просто то, что я не понимаю. Благодаря!

Редактировать: Хорошо ... так что еще несколько тестов.

FireFox

"lang-bash lang-dash".match(/lang-([a-z]+)/i) 
Array [ "lang-bash", "bash" ] 
"lang-bash lang-dash".match(/lang-([a-z]+)/ig) 
Array [ "lang-bash", "lang-dash" ] 
"lang-bash lang-dash".match("lang-([a-z]+)", "gi") 
Array [ "lang-bash", "lang-dash" ] 

Safari

"lang-bash lang-dash".match(/lang-([a-z]+)/i) 
[ "lang-bash", "bash" ] 
"lang-bash lang-dash".match(/lang-([a-z]+)/ig) 
[ "lang-bash", "lang-dash" ] 
"lang-bash lang-dash".match("lang-([a-z]+)", "gi") 
["lang-bash", "bash"] 

Chrome

"lang-bash".match(/lang\-([a-z]+)/i) 
["lang-bash", "bash"] 
"lang-bash".match(/lang\-([a-z]+)/gi) 
["lang-bash"] 
"lang-bash lang-dash".match("lang-([a-z]+)", "gi") 
["lang-bash", "bash"] 

Поскольку есть захват, я бы ожидать, результат чего-либо с флагами ig быть [ "lang-bash", "lang-dash", "bash", "dash" ] но я Думаю, это совсем не правильно. Кажется, что все браузеры действуют по-другому. Кто-нибудь знает, что происходит?

+0

Это похоже на массив захватов, начиная от группы 0 до группы 1. Что вы ожидали? На некоторых языках 'match' будет соответствовать всей строке, поэтому глобальная опция' g' не имеет смысла. Возможно, вы ищете поиск или поиск. – sln

+0

'g' не должно быть бессмысленным, потому что мой вход может иметь несколько значений. Только пример, который я дал, нет. Создание более значимой строки ввода делает меня еще более запутанным. Я действительно просто забочусь о захватах. – Travis

ответ

0

Хорошо, похоже, я просто смотрю, как работают разные браузеры с match или как они отображают данные при регистрации.

function getMatches(string, regex, index) { 
    index || (index = 1); // default to the first capturing group 
    var matches = []; 
    var match; 
    while (match = regex.exec(string)) { 
    matches.push(match[index]); 
    } 
    return matches; 
} 
getMatches("lang-bash lang-dash", /lang\-([a-z]+)/ig) 

имеет такое же значение, через Chrome, Safari, FireFox и Node.js из [ 'bash', 'dash' ]. Благодаря How do you access the matched groups in a JavaScript regular expression? для кода, который заставил меня изучить этот вариант.

1

Первоначально Firefox реализует нестандартный аргумент flags в String.prototype.{search, match, replace}. Этот аргумент будет deprecated in Firefox 39 and will be removed in future version. См. Больше в bug report об этой проблеме.

Что вы видите в Firefox из-за эффекта аргумента flags.

Когда match используется с мировым рисунком g, включены только основные матчи. Без глобального флага match возвращает первое совпадение в индексе 0 и зафиксированный текст в индексах от 1.

Поскольку Firefox знает о аргументе flags, он возвращает все основные совпадения без групп захвата, как показано на рисунке:

"lang-bash lang-dash".match("lang-([a-z]+)", "gi") 
"lang-bash".match("lang-([a-z]+)", "gi") 

Другие браузеры игнорируют flags аргумент, так что результат показывает только первый матч и захватив группы.

Если вам нужны флаги, укажите его в литеральном выражении RegExp (если шаблон исправлен) или конструктор RegExp (если шаблон динамический).

+0

Это отличная справочная информация. Кроме того, какой беспорядок. – Travis

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