0

私が持っているいくつかのスクリプトを編集するために正規表現を使用して学習しようとしています。

私のスクリプトにはそのようなものが含まれています

<person name="John">Will be out of town</person><person name="Julie">Will be in town.</person>

スクリプト内の名前の値を置き換える必要があります。名前への追加は常に同じですが、更新したくない名前がある場合があります。

私が持っているものの簡単な例:

string[] names = new string[1];
names[0] = "John-Example";
names[1] = "Paul-Example";

string ToFix = "<person name=\"John\">Will be out of town</person><person name=\"Julie\">Will be in town.</person>"

for (int i=0; i<names.Length; i++)
{
    string Name = names[i];
    ToFix = Regex.Replace(ToFix, "(<.*name=\")(" + Name.Replace("-Example", "") + ".*)(\".*>)", "$1" + Name + "$3", RegexOptions.IgnoreCase);
}

これはほとんどの場合機能しますが、2 つの問題があります。文字列に複数の人がいる場合、削除しすぎることがあります。次のように、最初の人から最後の人まですべてが削除されます。

Hello <person name="John">This is John</person><person name="Paul">This is Paul</person>

になる

Hello <person name="John-Example">This is Paul</person>

また、次のように、名前の値の後ろと終了のカラットの前にある余分なテキストを削除したいと思います。

<person name="John" hello>

次のように修正する必要があります。

<person name="John-Example">

私は正規表現に関するいくつかの記事を読みましたが、ここで何か小さなものが欠けていると感じています。これを修正する方法と理由を教えてください。

編集:私が使用しているこれらのスクリプトが XML として分類されるとは思いません。スクリプト全体に <> タグがある場合とない場合があります。この質問で私の最初の目標に戻ると、誰かが正規表現の動作を説明できますか? そして、終了タグの前の名前の値の後の余分なテキストを削除するにはどうすればよいですか?

4

1 に答える 1

2

あなたの正規表現は貪欲すぎます。.*?ただではなく試してみてください.*

また、XML の解析に正規表現を使用しないでください。


XDocumentを使用して、あなたが望むことを行う方法の例を次に示します。

var xdoc = XDocument.Parse(ToFix);
foreach (var person in xdoc.Elements("person"))
{
    var name = person.Attribute("name");
    if (person.LastAttribute != name)
    {
        person.RemoveAttributes();
        person.SetAttributeValue(name.Name, name.Value + "-Example");
    }
}
var output = xdoc.ToString();
于 2013-01-21T14:38:33.143 に答える