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で2番目の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 designerを使用してこれをテストすることから。

この正規表現は複数の一致を返し、各一致に 1 つのグループが含まれます。そのため、グループ (「1」という名前) から結果を取得しようとするべきではなく、一致のコレクションを繰り返し処理し、それぞれの値 (またはそれぞれのグループ) を取得する必要があります。

出力される結果は次のとおりです。

RAD RegEx デザイナーからの出力

したがってRegex.Matches、コードを呼び出して、結果を反復処理する必要がありますRegex.Match

于 2012-04-20T09:56:31.453 に答える
1

html/regex とは別に、すべての結果を一度に取得するには、 を使用します。Matchesそのメソッドは、MatchCollection見つかったすべてのMatchオブジェクトを含む を返します。

msdn の MatchCollection と Match オブジェクトを参照してください。

于 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 に答える