找不到更好的标题,但我需要一个正则表达式来从下面的示例中提取链接。
snip... flashvars.image_url = 'http://domain.com/test.jpg' ..snip
假设正则表达式是最好的方法。
谢谢
找不到更好的标题,但我需要一个正则表达式来从下面的示例中提取链接。
snip... flashvars.image_url = 'http://domain.com/test.jpg' ..snip
假设正则表达式是最好的方法。
谢谢
考虑以下示例代码。它显示了如何从您提供的字符串中提取。但是我已经扩展了一些字符串。通常,使用 .* 过于包容(如下例所示)。
要点是,有几种方法可以完成您的要求,给出的第一个答案使用“环顾四周”,而第二个答案建议使用“组”方法。选择主要取决于您的实际数据。
string[] tests = {
@"snip... flashvars.image_url = 'http://domain.com/test.jpg' ..snip",
@"snip... flashvars.image_url = 'http://domain.com/test.jpg' flashvars2.image_url = 'http://someother.domain.com/test.jpg'",
};
string[] patterns = {
@"(?<==\s')[^']*(?=')",
@"=\s*'(.*)'",
@"=\s*'([^']*)'",
};
foreach (string pattern in patterns)
{
Console.WriteLine();
foreach (string test in tests)
foreach (Match m in Regex.Matches(test, pattern))
{
if (m.Groups.Count > 1)
Console.WriteLine("{0}", m.Groups[1].Value);
else
Console.WriteLine("{0}", m.Value);
}
}
编辑:与您编辑的问题匹配的新正则表达式:
您需要在 a 之后匹配引号之间的内容=
,对吗?
@"(?<==\s*')[^']*(?=')"
应该做。
(?<==\s*')
断言在我们当前位置之前有一个=
,可选地后跟空格,然后是 a (正向向后看)。'
[^']*
匹配任意数量的非'
字符。
(?=')
断言匹配在下一个之前停止'
。
此正则表达式不检查这些引号内是否确实存在 URL。如果你想这样做,请使用
@"(?<==\s*')(?=(?:https?|ftp|mailto)\b)[^']*(?=')"
一个简单的正则表达式是@"=\s*'(.*)'"
.