Как сопоставить следующее выражение регулярного выражения - PullRequest
0 голосов
/ 10 января 2019

Я действительно новичок в Regex и все еще пытаюсь понять, как это работает. Я пытаюсь разработать регулярное выражение для захвата имени и значения из входного тега в HTML.

<input type='hidden' name='student' value='9208'>

Моя идея состоит в том, чтобы извлечь значение, связанное с именем (студент) и значением (9208). Я разработал следующее регулярное выражение, основанное на более раннем ответе в stakcoverflow на предыдущий вопрос.

/<(input)(?:\s+type=([\'"]?)(?<type>[^\'"]*?)\2\s*)?(?:\s+name=([\'"]?)(?<name>[^\'"]*?)\4\s*)?(?:\s+value=([\'"]?)(?<value>[^\'"]*?)\4\s*)?>/m

Вышеупомянутое регулярное выражение работает правильно с вводом, подобным

<input type='hidden' name='student' value='9208'>

Но это не захват строки, если нет одинарных кавычек или двойных кавычек вокруг значения, соответствующего атрибуту значения ( value = '9208' ) * 1018 EG-*

<input type='hidden' name='student' value=9208>

В приведенном выше случае он не дал никаких совпадений. Может кто-нибудь помочь мне исправить вышеприведенное регулярное выражение? Спасибо

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Я согласен с комментариями к вашему посту, что использование регулярных выражений для разбора HTML не очень хорошая идея. Но это все еще возможно, хотя это требует от вас быть очень точным и наблюдательным.

В вашем случае регулярное выражение может быть следующим (для удобства чтения я разделил его на куски):

  • <(input) - < и первая группа захвата, соответствующая имени тега.
  • (?:\s+type=([\'"]?)(?<type>[^\'"]+)\2)? - деталь для атрибута type.
  • (?:\s+name=([\'"]?)(?<name>[^\'"]+)\4)? - деталь для атрибута name.
  • (?:\s+value=([\'"]?)(?<value>[^\'"]+)\6)? - деталь для атрибута value.
  • \s*> - последовательность пробелов и >, оканчивающих тег.

Ваша ошибка в том, что в части, касающейся value, вы назвали группу № 4, но ты должен был позвонить группе № 6.

Другое исправление состоит в том, что если следующая группа начинается с \s+, то текущая группа не должна заканчиваться на \s* (как вы сделали).

Рабочий пример см. https://regex101.com/r/IOLKTV/1

0 голосов
/ 10 января 2019

В вашем регулярном выражении есть небольшая проблема.

<(input)(?:\s+type=([\'"]?)(?<type>[^\'"]*?)\2\s*)?(?:\s+name=([\'"]?)(?<name>[^\'"]*?)\4\s*)?(?:\s+value=([\'"]?)(?<value>[^\'"]*?)\4\s*)?>

Здесь, если вы заметили, в вашей части этого регулярного выражения (?<value>[^\'"]*?)\4\s*) вы используете \4 в качестве закрывающей или двойной кавычки, но \4 - это группа захвата в имени регулярного выражения (?<name>[^\'"]*?)\4\s*), следовательно, если атрибут value равен также заключенный в тот же символ, двойную кавычку или одинарную кавычку, тогда ваше регулярное выражение будет соответствовать отлично, но если значение атрибута name заключено в нечто, отличное от части атрибута value, то ваше регулярное выражение просто не будет совпадать.

Так что вам просто нужно немного исправить и сделать это \6 в (?<value>[^\'"]*?)\4\s*) части, и ваше регулярное выражение начнет совпадать, как вы ожидали.

Вот правильное регулярное выражение, которое вы должны использовать,

<(input)(?:\s+type=([\'"]?)(?<type>[^\'"]*?)\2\s*)?(?:\s+name=([\'"]?)(?<name>[^\'"]*?)\4\s*)?(?:\s+value=([\'"]?)(?<value>[^\'"]*?)\6\s*)?>

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...