1

这是我的正则表达式:

href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))

这就是我所拥有的:

"<p>dfhdfh</p>\r\n<p><a href=\"/Content/blabla/345/344\">najnov</a></p>\r\n<p>&nbsp;</p>\r\n<p><a href=\"/Content/blabla/345/323:test 1\">test 1&nbsp;</a></p>"

但是 m.Groups 是:

{href="/Content/blabla/345/344"}
{/Content/blabla/345/344}

如何获得m中的第二个href?

这是我的代码:

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));
                }
4

3 回答 3

1

使用RAD 软件 RegEx 设计器对此进行测试。

此正则表达式返回多个匹配项,每个匹配项中有一个。所以你不应该试图从组(命名为“1”)中得到你的结果,你应该迭代匹配的集合并检索每个(或每个组中的组)的值。

这是获得输出的结果:

RAD RegEx 设计器的输出

所以你应该Regex.Matches在你的代码中调用,并遍历结果,而不是Regex.Match.

于 2012-04-20T09:56:31.453 回答
1

除了 html/regex 的东西,要一次获得所有结果,使用Matches,该方法返回一个MatchCollection包含所有找到的Match对象。

请参阅msdn 上的 MatchCollection 和匹配对象

于 2012-04-20T09:56:44.523 回答
0

我将假设原始字符串是这样的:

<p>dfhdfh</p>
<p><a href="/Content/blabla/345/344">najnov</a></p>
<p>&nbsp;</p>
<p><a href="/Content/blabla/345/323:test 1">test 1&nbsp;</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以清楚地表明我们正在按其名称检索该组,而不是按其编号。

正如你所看到的,你正在做很多你不需要做的工作。

于 2012-04-20T10:29:42.687 回答