我正在尝试匹配以下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'
答案 0 :(得分:3)
^
匹配一行的开头,$
匹配该行的结尾。将^.+$
更改为\w+
,它将适用于不包含任何符号的值。将其设为括号组以捕获值 - (\w+)
更新:匹配引号之间的任何内容(假设值中没有引号),请使用[^"]+
。如果值中有转义引号,那么它就是一个不同的球赛。 .+
在这种情况下会起作用,但由于回溯,它会变慢。 .+
首先匹配字符串的结尾(因为.
甚至匹配"
),然后查找"
并失败。然后它返回一个位置并查找"
并再次失败 - 依此类推,直到找到"
- 如果在value
之后还有一个属性,那么您将获得{ {1}}作为匹配。
matchTextHere" nextAttr="something
话虽如此,如果任何属性值之间有额外的空格,正则表达式将失败。使用正则表达式解析html并不是一个好主意 - 如果必须使用正则表达式,则可以使用x = response.match(/<input name="example" type="hidden" value="([^"]+)" \/>/)[1]
\s+
答案 1 :(得分:0)
因为您的正则表达式中包含行首标记(^
)和行尾标记($
)。我认为您打算捕获价值,这可能会解决您的问题:value="(.+?)"
。
请注意,使用正则表达式处理html不是一个好主意,它甚至可以drive you crazy。最好改为使用html parser。
答案 2 :(得分:0)
您不需要^和$:
x = response.match(/<input name="example" type="hidden" value=".+" \/>/)[0]
答案 3 :(得分:0)
你只需要将[0]更改为[1]
response='<input name="example" type="hidden" value="matchTextHere" />'
puts response.match(/<input name="example" type="hidden" value="(.*?)" \/>/)[1]
matchTextHere