我有一个为我工作的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的理解不清楚?
答案 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
。