Почему очень похожие регулярные выражения работают по разному?
У меня есть две строки:
let str1 = `<link rel="stylesheet" type="text/css" href="css/style.min.css">`;
let str2 = `<script type="text/javascript" src = "js/script.min.js">`;
Я хочу найти в них части <link rel="stylesheet" type="text/css" href= и <script type="text/javascript" src =. Для поиска в первой строке я использовал такое регулярное выражение:
/<link.*href=/
Для второй строки такое:
/<script.*src=/
Я увидел, что регулярка с фрагменомhref=подходит для первой строки, но регулярка с фрагментом src= - не подходит для второй. Объясните, пожалуйста, почему так происходит? И регулярки и строки вроде бы очень похожи.
Еще такой момент: Для двух этих случаев подходят регулярные выражения:
/<link.*=/
и
/<script.*=/
Хотя, как я понял, в первом случае мы должны найти <link rel, а во втором - <script type. Почему эти выражения работают не так, как я думал?
Ответы (1 шт):
/<script.*src=/ не работает, потому что в вашей строке между src и = есть пробел src =, который ваше регулярное выражение не учитывает.
Учесть возможный пробел можно, например, так: /<script.*src\s*=/ (пробел может быть и не один, поэтому квантифаер *, а не ?)
Второй ваш вопрос не очень понятен. .* означает "любое количество произвольных символов", вдруг вы не в курсе. В этих строках есть и указанная вами первая часть строки и знак = после каких-то других символов, поэтому шаблоны срабатывают.
Мне не понятно почему шаблоны срабатывают именно до последнего равно
Потому что по умолчанию регулярные выражения "жадные" (greedy). Под шаблон "произвольные символы в произвольном количестве" по умолчанию попадает максимум того, что туда может попасть. Для изменения этого поведения нужно использовать "не жадный" шаблон, например, вместо .* использовать .*? (если я правильно помню).