为什么这个RegEx按我想要的方式工作?

时间:2008-11-04 18:55:47

标签: regex

我有一个为我工作的RegEx,但我不知道为什么它对我有用。我会解释一下。

RegEx: \s*<in.*="(<?.*?>)"\s*/>\s*


它找到的文本(它在输入标记之前和之后找到空白区域):

<td class="style9">
      <input name="guarantor4" id="guarantor4" size="50" type="text" tabindex="10" value="<?php echo $data[guarantor4]; ?>"  />    </td>
</tr>


我不明白的部分:

<in.*=" <--- As I understand it, this should only find up to the first =" as in it should only find <input name="

It actually finds: <input name="guarantor4" id="guarantor4" size="50" type="text" tabindex="10" value=" which happened to be what I was trying to do.

我对此RegEx的理解不清楚?

5 个答案:

答案 0 :(得分:8)

您似乎正在使用'贪婪'匹配。

贪婪的匹配说“尽可能多地吃这些东西”

尝试

<in[^=]*=  

对于初学者来说,这将阻止它与“=”匹配,作为“。*”

的一部分

但将来你可能想要阅读

.*?  

.+?

符号,在匹配而不是最后一个匹配的第一个可能条件处停止。

如果您只是在看到两个字符时才停止使用“非贪婪”语法会更好,

即:

<in.*?=id

会在第一个'= id'上停止,无论两者之间是否有'='。

答案 1 :(得分:7)

.*贪婪。您希望.*?仅查找第一个=

答案 2 :(得分:4)

。*贪婪,所以它会找到最后一个=。如果你想要它不贪婪,添加一个问号,如下所示:。*?

答案 3 :(得分:2)

  

据我了解,这应该只是   找到第一个=“就像在里面一样   应该只找到&lt; input name =“

你没有说你正在写什么语言,但几乎所有正则表达式系统都是“贪婪的匹配器” - 也就是说,它们匹配输入的最长子串。在您的情况下,这意味着从输入标记的开头到最后一个相等引用序列的所有内容。

大多数正则表达式系统都有办法指定模式只匹配最短的子字符串,而不是最长的 - “非贪婪匹配”。

顺便说一句,不要假设第一个参数是name =,除非您完全控制输入的构造。 HTML和XML都允许以任何顺序指定属性。

答案 4 :(得分:2)

您的贪婪方法引起混乱。您想要.*? 考虑输入101000000000100

使用1.*1*很贪心-它会一直匹配到结尾,然后回溯直到可以匹配1,剩下1010000000001.*?是非贪婪的。 *将不匹配任何内容,但是将尝试匹配多余的字符,直到匹配1,最终匹配101