正则表达式以匹配元素位置的变化

时间:2012-05-23 00:18:00

标签: regex

我需要匹配它并从这些标记中提取值。问题是它们是动态生成的,有人决定每次刷新页面时都要切换。

所以标签可以是这样的:

<input type="hidden" value="838218230" name="vstablepid_2717_1State">

或者这个:

<input type="hidden" name="vstablepid_2717_1State" value="838218230" >

我可以单独完成每一项,例如:

value="(.+?)".*"vstable

是否有一个声明可以兼顾两者?


到目前为止的想法:

使用某种类型的可选语法我可以说在值之前或之后找到'vstable'匹配 - 但是我仍然需要在该行上找到至少一个'vstable'。

3 个答案:

答案 0 :(得分:2)

使用预览断言vstable,然后抓取您的内容(来自群组):

<(?=[^>]*vstable[^>]*>)[^>]*value="(.*?)"[^>]*>

正则表达式(?=...)的前瞻部分要求vstable出现在下一个>

之前

答案 1 :(得分:1)

你能不能只是or这两个陈述?

(?:value="(.+?)".*"vstable)|(?:"vstable.*?value="(.+?)")

或者我错过了什么?

编辑:这个方法有一个警告 - 有时这个值会出现在第一个捕获组中,有时会出现在第二个捕获组中。在这方面,波西米亚人的回答也更好。

答案 2 :(得分:0)

您当前的正则表达式:

value="(.+?)".*"vstable 

强制执行vstable之后value发生的事实。

你可以简单地取出那部分,只需要它:

value="(.+?)"  

对于大多数正则表达式编译器,.+?应该是非贪婪的,并且当它到达结束引用"时将停止匹配。这样,无论value发生在何处,它都会被拾取。

但这取决于您的需求,以及您是否特别想要在value出现的行中选择vstable,但问题中没有指明,所以我给了一个通用答案。