我有一个源字符串
<img src="./CaptchaServlet?rd=htb54m" class="flt" id="captcha" height="33" width="110"/>
我想在CaptchaServlet?rd=xxxxxx"
。
我试过但不工作请帮助我,我的正则表达式如下
r = New Regex("CaptchaServlet?rd=*(.+?)""", RegexOptions.IgnoreCase Or RegexOptions.Compiled)
答案 0 :(得分:2)
你写的表达式CaptchaServlet?rd=*(.+?)""
有几个错误:
?
表示使前面的t
可选。我认为你真的打算让问号成为一个文字问号,所以你需要将其作为\?
*
意味着=
也可以显示零或更多时间到无限时间。这有点模棱两可,如果您的源字符串可能有1或0个等号,那么您可能希望将=*
替换为=?
,这只会使=
成为可选,就个人而言,我会重写表达式以主动避免在HTML中使用正则表达式与模式匹配的一些常见问题。我的表达是:
<img(?=\s|>)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\ssrc=(['"]?)(.*?)\1(?:\s|>))(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*>
或者,如果您只想提取rd
查询字符串值,可以使用:<img(?=\s|>)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\ssrc=(['"]?)\.\/CaptchaServlet\?rd=(.*?)\1(?:\s|>))(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*>
。这将把xxxxxx放入捕获组2
示例文字
注意前两个图像标签有一些非常困难的边缘情况
<img onmouseover=' img = 10; src="NotYourImage.png" ; if (3 <img && src="NotYourImage.png" && 6>3) { funRotate(src) ; } ; ' src="ImageYouAreLookingFor.png">
<img onmouseover=' src="NotTheDroidsYouAreLookingFor.png" ; if (x > 3) { funRotate(src); } ' src="http://another.example/picture.png">
<img src="./CaptchaServlet?rd=htb54m" class="flt" id="captcha" height="33" width="110"/>
VB.Net Exmaple
Imports System.Text.RegularExpressions
Module Module1
Sub Main()
Dim sourcestring as String = "replace with your source string"
Dim re As Regex = New Regex("<img(?=\s|>)(?=(?:[^>=]|='[^']*'|=""[^""]*""|=[^'""][^\s>]*)*?\ssrc=(['""]?)\.\/CaptchaServlet\?rd=(.*?)\1(?:\s|>))(?:[^>=]|='[^']*'|=""[^""]*""|=[^'""][^\s>]*)*>
",RegexOptions.IgnoreCase OR RegexOptions.IgnorePatternWhitespace OR RegexOptions.Multiline OR RegexOptions.Singleline)
Dim mc as MatchCollection = re.Matches(sourcestring)
Dim mIdx as Integer = 0
For each m as Match in mc
For groupIdx As Integer = 0 To m.Groups.Count - 1
Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames(groupIdx), m.Groups(groupIdx).Value)
Next
mIdx=mIdx+1
Next
End Sub
End Module
<强>匹配强>
组0获取整个图像标签
第1组获取用于包围src属性的引用,用于确保正确的结束引用匹配
第2组获取src值,或者如果使用上面的备用正则表达式,则只接收rd查询字符串
[0][0] = <img onmouseover=' img = 10; src="NotYourImage.png" ; if (3 <img && src="NotYourImage.png" && 6>3) { funRotate(src) ; } ; ' src="ImageYouAreLookingFor.png">
[0][1] = "
[0][2] = ImageYouAreLookingFor.png
[1][0] = <img onmouseover=' src="NotTheDroidsYouAreLookingFor.png" ; if (x > 3) { funRotate(src); } ' src="http://another.example/picture.png">
[1][1] = "
[1][2] = http://another.example/picture.png
[2][0] = <img src="./CaptchaServlet?rd=htb54m" class="flt" id="captcha" height="33" width="110"/>
[2][1] = "
[2][2] = ./CaptchaServlet?rd=htb54m
答案 1 :(得分:1)
试试这个:
CaptchaServlet\?rd=[^"]*
...只要双引号永远不会作为数据的一部分出现,这就行了。 :)
我强烈建议您查看http://regexhero.net/,它会在测试.net正则表达式时真正帮助您。
编辑:改进了正则表达式。之前它只适用于字母数字字符。