当字符串包含多个双引号时,从字符串中提取URL的正则表达式失败?

时间:2015-06-05 05:35:17

标签: c# regex linq

我正在使用正则表达式从字符串中提取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);
}

Demo with problem

有人可以帮我解决这个问题吗?

2 个答案:

答案 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时,你不可能完全依赖正则表达式。使用解决方案,而不是解决方法。