Этот RegExp из Google Analytics действительно что-то делает? - PullRequest
0 голосов
/ 07 октября 2018

Вот часть кода:

var 
[...snip...]
ye=/^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i,

Это регулярное выражение используется дважды, оба раза с ye.test(a).И все же я не нашел строк, которые бы не соответствовали .Мне трудно в это поверить, но действительно ли это RegExp соответствует каждой мыслимой строке?

Демонстрация:

var ye = /^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;
console.log(ye.test("askjvhlkauehavkn"))
console.log(ye.test("/"))
console.log(ye.test("https:"))
console.log(ye.test("mailto/L:"))

1 Ответ

0 голосов
/ 07 октября 2018

(?:https?|mailto|ftp) соответствует http или https или mailto или ftp, за которым следует :|[^:/?#]*, что является альтернативой: : или что-либо кроме :/>#, ноль или более раз, а затем следуют(?:[/?#]|$), что означает один из /?# или конец строки ($).

Будет соответствовать mailto:, ftp:, https:, ftpasda (любая строканачиная с ftp, https, http, mailto, за которым следует двоеточие или любое другое число, кроме :/>#).

UPDATE

После проверки выясняется, что это чередование вне группы без захвата относится не только к двоеточию, но и ко всей группе.Таким образом, если mailto или какая-либо строка в чередовании не совпадает, механизм регулярных выражений попытается сопоставить шаблон с другой стороны упомянутого чередования.Это пример строки, которая не будет соответствовать: :///////. Демо-версия.

...