0

someXml を抽出するにはどうすればよいですか?

frame 0
    push 'this'
    getVariable
    push 'g_data_1343488'
    push ' 

    someXml'

    setMember
end // of frame 0

RegEx を使用しようとしていますが、うまくいきません:

foreach (var match in Regex.Matches(file, @"(?<=push ').*(?=')"))

これの問題:たとえば、「g_data_1343488」または「this」を取得したくありません。

4

2 に答える 2

1

ここに 1 つの可能性があります。単一引用符の間の内容を XML として認識しようとする正規表現です。これは完璧な正規表現ではありません。使用しても問題ないかどうかは、要件によって異なります。正規表現が正確でなければならないほど、読み取りが難しくなります。このままでは、この式はすべての XML に一致するわけではなく、一部の無効な XML にも一致します。

たとえば、この正規表現は、数字で始まる名前のタグに一致します。また、XML の終了タグと属性も一致します。必要に応じて微調整できます。

ここにあります:

push\s+'\s*<(\w+)(?:\s+\w+=(?:"[^"]*"|'[^']*'))*>(?:[^<]+|(?!</\1>)</?\w+(?:\s+\w+=(?:"[^"]*"|'[^']*'))*\s*/?>)*</\1>\s*'

表現の内訳はこちら。push ステートメントの開始:

push\s+'\s*

ルート XML タグを検出し、その名前を取得します。一重引用符と二重引用符で区切られた属性を許可します。:

<(\w+)(?:\s+\w+=(?:"[^"]*"|'[^']*'))*>

ルート タグ内のすべての内部タグとテキスト要素をループします。一重引用符と二重引用符で区切られた属性を許可します。

(?:[^<]+|(?!</\1>)</?\w+(?:\s+\w+=(?:"[^"]*"|'[^']*'))*\s*/?>)*

終了ルート タグをキャプチャします。

</\1>\s*'

また、単純にプッシュ コマンドをキャプチャして、このソリューションのように関数を介してそれらの値を実行することもできます: How to check for valid xml in string input before calling .LoadXml()

于 2012-11-15T14:16:41.493 に答える
0
var allMatches = Regex.Matches(text, @"(frame.*push ')(.*?)(?='.*end)", RegexOptions.Singleline);

foreach (Match matches in allMatches)
{
    String somexml = matches.Groups[2].Value;
}
于 2012-11-15T12:50:54.090 に答える