-1

У меня есть две строки:

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 Answers1

3

/<script.*src=/ не работает, потому что в вашей строке между src и = есть пробел src =, который ваше регулярное выражение не учитывает.

Учесть возможный пробел можно, например, так: /<script.*src\s*=/ (пробел может быть и не один, поэтому квантифаер *, а не ?)

Второй ваш вопрос не очень понятен. .* означает "любое количество произвольных символов", вдруг вы не в курсе. В этих строках есть и указанная вами первая часть строки и знак = после каких-то других символов, поэтому шаблоны срабатывают.

Мне не понятно почему шаблоны срабатывают именно до последнего равно

Потому что по умолчанию регулярные выражения "жадные" (greedy). Под шаблон "произвольные символы в произвольном количестве" по умолчанию попадает максимум того, что туда может попасть. Для изменения этого поведения нужно использовать "не жадный" шаблон, например, вместо .* использовать .*? (если я правильно помню).

CrazyElf
  • 71,194
  • Спасибо. А что скажите насчет второй части вопроса? – Konstantin_SH Sep 01 '21 at 06:11
  • @Konstantin_SH Я как-раз дополнил ответ ) – CrazyElf Sep 01 '21 at 06:13
  • Мне не понятно почему шаблоны срабатывают именно до последнего равно, ведь по идее под реулярное выражение /<script.*=/ попадает и часть строки <script type=. Почему тогда регулярное выражение не остановилось, когда нашло первое равно? – Konstantin_SH Sep 01 '21 at 06:21