(ruby) помогите сопоставить мое регулярное выражение - PullRequest
0 голосов
/ 27 ноября 2009

Я пытаюсь сопоставить значение следующего фрагмента HTML:

<input name="example" type="hidden" value="matchTextHere" />

со следующим:

x = response.match(/<input name="example" type="hidden" value="^.+$" \/>/)[0]

почему это не работает? это не соответствует 'matchTextHere'

редактирование:

когда я использую:

x = response.match(/<input name="example" type="hidden" value="(.+)" \/>/)[0]

соответствует целому элементу html, а не только значению matchTextHere

Ответы [ 4 ]

3 голосов
/ 27 ноября 2009

^ соответствует началу строки, а $ соответствует концу строки. Измените ^.+$ на \w+, и оно будет работать для значений, которые не содержат символов. Сделайте это скобкой, чтобы получить значение - (\w+)

Обновление: чтобы сопоставить что-либо между кавычками (при условии, что в значении нет кавычек), используйте [^"]+. Если в значении есть экранированные кавычки, это другая игра в мяч. .+ будет работать в этом случае, но будет медленнее из-за возврата. .+ сначала соответствует концу строки (потому что . соответствует даже "), затем ищет " и завершается неудачей. Затем он возвращается на одну позицию и ищет " и снова терпит неудачу - и так далее, пока не найдет " - если после value был еще один атрибут, то вы получите matchTextHere" nextAttr="something в качестве совпадения.

x = response.match(/<input name="example" type="hidden" value="([^"]+)" \/>/)[1]

При этом, регулярное выражение не будет выполнено, если между какими-либо значениями атрибута будет дополнительный пробел. Синтаксический анализ html с помощью регулярных выражений не очень хорошая идея - и если вам необходимо использовать регулярные выражения, вы можете разрешить дополнительные пробелы, используя \s+

/<input\s+name="example"\s+type="hidden"\s+value="([^"]+)"\s*\/>/
0 голосов
/ 27 ноября 2009

вам просто нужно изменить [0] на [1]

response='<input name="example" type="hidden" value="matchTextHere" />'

puts response.match(/<input name="example" type="hidden" value="(.*?)" \/>/)[1]

matchTextHere
0 голосов
/ 27 ноября 2009

Вам не нужны ^ и $:

x = response.match(/<input name="example" type="hidden" value=".+" \/>/)[0]
0 голосов
/ 27 ноября 2009

Поскольку в вашем регулярном выражении есть токен начала строки (^) и токен конца строки ($). Я думаю, что вы хотели зафиксировать значение, это может решить вашу проблему: value="(.+?)".

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

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