我需要匹配它并从这些标记中提取值。问题是它们是动态生成的,有人决定每次刷新页面时都要切换。
所以标签可以是这样的:
<input type="hidden" value="838218230" name="vstablepid_2717_1State">
或者这个:
<input type="hidden" name="vstablepid_2717_1State" value="838218230" >
我可以单独完成每一项,例如:
value="(.+?)".*"vstable
是否有一个声明可以兼顾两者?
到目前为止的想法:
使用某种类型的可选语法我可以说在值之前或之后找到'vstable'匹配 - 但是我仍然需要在该行上找到至少一个'vstable'。
答案 0 :(得分:2)
使用预览断言vstable
,然后抓取您的内容(来自群组):
<(?=[^>]*vstable[^>]*>)[^>]*value="(.*?)"[^>]*>
正则表达式(?=...)
的前瞻部分要求vstable
出现在下一个>
答案 1 :(得分:1)
你能不能只是or
这两个陈述?
(?:value="(.+?)".*"vstable)|(?:"vstable.*?value="(.+?)")
或者我错过了什么?
编辑:这个方法有一个警告 - 有时这个值会出现在第一个捕获组中,有时会出现在第二个捕获组中。在这方面,波西米亚人的回答也更好。
答案 2 :(得分:0)
您当前的正则表达式:
value="(.+?)".*"vstable
强制执行vstable
之后value
发生的事实。
你可以简单地取出那部分,只需要它:
value="(.+?)"
对于大多数正则表达式编译器,.+?
应该是非贪婪的,并且当它到达结束引用"
时将停止匹配。这样,无论value
发生在何处,它都会被拾取。
但这取决于您的需求,以及您是否特别想要在value
出现的行中选择vstable
,但问题中没有指明,所以我给了一个通用答案。