我正在使用正则表达式从字符串中提取url并且它主要工作;
var regex=new Regex("<a [^>]*href=(?:'(?<href>.*?)')|(?:\"(?<href>.*?)\")",RegexOptions.IgnoreCase);
以下字符串正常工作:
"This is Test page <a href='test.aspx'>test page</a>"
"This is Test page <a href='test1.aspx'>test</a> another one <a href='test2.aspx'>test</a>"
"This is Tests\"s page <a href='test1.aspx'>test</a> another one <a href='test2.aspx'>test</a>"
"This is Test page"
"This is Test page\"s without problem"
但是有一段时间它没有返回好结果。以下代码返回错误结果(string contains 2 double quotes
) -
var inputString="This string create \"problem\" for me";
var regex=new Regex("<a [^>]*href=(?:'(?<href>.*?)')|(?:\"(?<href>.*?)\")",RegexOptions.IgnoreCase);
var urls=regex.Matches(inputString).OfType<Match>().Select(m =>m.Groups["href"].Value);
foreach(var zzzzzzz in urls){
Console.WriteLine(zzzzzzz);
}
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
也许您可以像这样更改正则表达式:<a .*?href=(?:['"](?<href>[^'"]*?)['"])
关于Csharp:"<a .*?href=(?:['\"](?<href>[^'\"]*?)['\"])"
答案 1 :(得分:0)
您应该使用HTML Parser来消除当前和进一步的麻烦。可以找到经过测试的工作示例for example here。
至于你的正则表达式,它当前失败了,因为你没有包含在一个组中的交替。因此,它可以返回其中没有<a... href
的字符串。此外,您当前的正则表达式还有其他问题。
"fixed" regex(意味着它能够处理转义的实体以及双引号和单引号)如下所示:
(?i)<a\b[^<]*href=(?:(?:'(?<href>[^'\\]*(?:\\.[^'\\]*)*)')|(?:\"(?<href>[^'\\]*(?:\\.[^'\\]*)*))\")
但在解析HTML时,你不可能完全依赖正则表达式。使用解决方案,而不是解决方法。