正则表达式不工作的C#
问题描述:
这里是我的正则表达式:正则表达式不工作的C#
href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))
,这里是我有:
"<p>dfhdfh</p>\r\n<p><a href=\"/Content/blabla/345/344\">najnov</a></p>\r\n<p> </p>\r\n<p><a href=\"/Content/blabla/345/323:test 1\">test 1 </a></p>"
但m.Groups是:
{href="/Content/blabla/345/344"}
{/Content/blabla/345/344}
如何获得第二个href在m?
这里是我的代码:
Match m = Regex.Match(myString, "href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))", RegexOptions.IgnoreCase);
if (m.Success)
{
for (int ij = 0; ij < m.Groups.Count; ij++)
myString = myString.Replace(m.Groups[ij].Value.Substring(7), m.Groups[ij].Value.Substring(m.Groups[ij].Value.LastIndexOf("/") + 1));
}
答
从这个测试使用RAD software RegEx designer。
此正则表达式返回多个匹配,每个匹配中的一个组。所以你不应该试图从组中得到你的结果(命名为“1”),你应该迭代匹配的集合并检索每个组的值(或每个组中的值)。
这是获取输出结果:
所以,你应该调用代码Regex.Matches
,并通过结果,而不是Regex.Match
迭代。
答
除了HTML /正则表达式的东西,要立即获取所有结果,使用Matches
,该方法返回MatchCollection
包含所有找到Match
对象。
请参阅msdn上的The MatchCollection and Match Objects。
答
我要去承担原始字符串是这样的:
<p>dfhdfh</p>
<p><a href="/Content/blabla/345/344">najnov</a></p>
<p> </p>
<p><a href="/Content/blabla/345/323:test 1">test 1 </a></p>
..和你贴的是字符串文字你会用它来创建的字符串。让所有的href
属性出来的就是这样简单:
Regex r = new Regex(@"href\s*=\s*(?:""(?<HREF>[^""]*)""|(?<HREF>\S+))");
foreach (Match m in r.Matches(htmlString))
{
Console.WriteLine(m.Groups["HREF"].Value);
}
我通过更名捕获组来HREF
要清楚,我们正在通过其名检索组,不它的数量。
正如你所看到的,你正在做一些你不需要做的工作。
[您不应该试图用正则表达式解析HTML。](http://stackoverflow.com/a/1732454/41071)改为使用HTML解析器,比如HTML Agility Pack。 – svick 2012-04-20 09:47:34
另外,你能告诉我们你的代码实际上使用你的正则表达式吗? – svick 2012-04-20 09:48:52
@svick有它。 – 2012-04-20 09:53:07