2017-02-08 2 views
2

エスケープされたXML文字の置換を行う必要があります。><および&これは、正規表現パターンが開始タグと終了タグのときに><が見つからないようにするために重要です。正規表現(C#):一致><&(不正なXML文字)ただし、qutoesに含まれる場合

例、文字列<Element><Element value="'hello&stack<overflow>'"/></Element>

与えられた私だけを取得する必要><と単一引用符'内にある&。 これは正しいので、私はそれらを適切な&amp;&lt;&gt;に置き換えることができます(長い話は、混乱したXML解析の結果です)。

私は'(.*)'を使用して、すべての文字を一重引用符で囲むことができますが、ここでどのようにその中のエスケープ文字のみを抽出することができますか。

答えて

2

あなたはすべての必然的な属性名/値でタグ名と一致し、値のみ(または名前の内側<>を交換することができます同様に、データがいかに乱雑であるかによって異なります)。

これはRegex.Replace一致評価以内に行うことができます。

var s = "<Element><Element value=\"'hello&stack<overflow>'\" value=\"'hi&stack<over flow2 >'\"/></Element>"; 
var rx = @"((?:<[a-zA-Z][\w:-]*|\G(?!\A))\s+[^\s=<]*=)(""[^""]*"")"; 
var clean = Regex.Replace(s, rx, m => 
    string.Format("{0}{1}", m.Groups[1].Value, m.Groups[2].Value.Replace("&", "&amp;").Replace("<", "&lt;").Replace(">", "&gt;")) 
); 
// => <Element><Element value="'hello&amp;stack&lt;overflow&gt;'" value="'hi&amp;stack&lt;over flow2 &gt;'"/></Element> 

はここC# demo

regex demoある参照してください。詳細:

  • ((?:<[a-zA-Z][\w:-]*|\G(?!\A))\s+[^\s=<]*=) - グループ1:
    • (?:<[a-zA-Z][\w:-]*|\G(?!\A))から<、いずれかのASCII文字、0+ワード文字、:、または-<[a-zA-Z][\w:-]*を参照)、OR(|)前回の終わり成功した試合(\G(?!\A)を参照)
    • \s+ - 1+空白
    • [^\s=<]*= - 0+空白文字以外の文字、=<
  • ("[^"]*") - グループ2:
    • "[^"]*" - "、0+ "以外の文字、その後"
+0

これもチェック:http://stackoverflow.com/questions/42065310/multiple-split-in-string-using -regex – MYGz

+0

素晴らしい。それは私が決めることができなかったことです。ありがとう! – MH175

+0

@MYGz:完了 –

1

このケースでは機能します。より多くの入力を含めることができれば、それらを改善してカバーすることもできます。

この

チェック:

(?<!^)(>|<|&)(?=.*') 

デモ:

https://regex101.com/r/EgXlcD/2

+0

はありがとうございました。これは完璧に動作しています。 – MH175

+0

あまりにも早く話しましたが、私はそれがうまくいかない場合の例を編集しました。 – MH175

+1

@ MH175 \t正規表現で行うのはちょっと難しいかもしれません。これは、XMLパーサで非常に簡単に行うことができます。私はC#に暴露されていないか、あなたのためにやったでしょう。これを確認してください:http://stackoverflow.com/questions/642293/how-do-i-read-and-parse-an-xml-file-in-c – MYGz

関連する問題