2

XMLドキュメントをフォーマットしようとしているので、次のような文字列をメソッドに渡します。

"<foo><subfoo><subsubfoo>content</subsubfoo></subfoo><subfoo/></foo>"

そして、私はタグを見つけることに基づいてそれを分割しようとしています。各要素(タグまたはコンテンツ)を次のような一意の文字列に分割したいと思います。

"<foo>", "<subfoo>", "<subsubfoo>", "content", "</subsubfoo>", "</subfoo>", "<subfoo/>", "</foo>"

そしてこの目的のために私はコードを使用します:

string findTagString = "(?<=<.*?>)";
Regex findTag = new Regex(findTagString);
List<string> textList = findTag.Split(text).ToList();

上記のコードは、「コンテンツ」を独自の文字列に分割しないことを除いて、正常に機能します。

"<foo>", "<subfoo>", "<subsubfoo>", "content</subsubfoo>", "</subfoo>", "<subfoo/>", "</foo>"

これを達成するために正規表現を書き直す方法はありますか?不一致を独自の文字列に分割しますか?

または、言い換えると、正規表現の一致の前と後に文字列を分割することは可能ですか?

4

4 に答える 4

4

この正規表現を使用して(<.*?>)|(.+?(?=<|$)) 一致をキャストしますList<string>

于 2012-07-10T18:48:14.440 に答える
2

html仕様を無視することにより、<>意味がありません。

これを使用して分割するだけで簡単に実行できます(?<=>)|(?=<)

これにより、

<foo>
<subfoo>
<subsubfoo>
content
</subsubfoo>
</subfoo>
<subfoo/>
</foo>
于 2012-07-10T20:03:15.483 に答える
1

xml の複雑さに応じて、正規表現または xpath を介してこれを行うことができます。

正規表現を使用する場合は、おそらく次のようにしたいと思うでしょう。

public static string xml = "<foo><subfoo><subsubfoo>content</subsubfoo></subfoo><subfoo/></foo>";
public static Regex re = new Regex(@"\<([A-Za-z0-9]*)\b[^>]*\>(.*?)\</\1\>");

static string GetContentViaRegex()
{
    string content = xml;
    while (re.IsMatch(content))
    {
        Match match = re.Match(content);
        if (!match.Success)
            break;

        content = match.Groups[2].Value;
    }
    return content;
}

正規表現は基本的に一致する開始/終了タグを検索し (のようなものは一致させたくありません<foo>stuff here, possibly including more tags</bar>)、最も内側のコンテンツが見つかるまで一致するタグを掘り下げ続けます。この正規表現は、どのタグにも属性がないことを前提としています。

xpath 経由でこれを行いたい場合は、次のようにすることができます。

static string GetContentViaXPath()
{
    var nav = new XPathDocument(new StringReader(xml)).CreateNavigator();
    return nav.SelectSingleNode("//text()").Value;
}

これは基本的に、ドキュメント内でヒットした最初のテキスト ノードを取得します。(入力が常に有効であることが確実でない限り、エラーチェックを追加する必要があります)

于 2012-07-10T19:05:40.423 に答える
1

XML は正規言語ではない (ポンピング補題で証明できる) ため、XML は正規表現で解析できません。

優れた XML ライブラリを見つけて使用することをお勧めします。

于 2012-07-10T18:51:41.043 に答える