2

C# 正規表現を使用して、特定のパターンに一致する文字列を置き換えたい。Regex.Replace Function を使用してさまざまな正規表現を試しましたが、どれもうまくいきませんでした。文字列の一部を置き換える正しい正規表現を作成するのを手伝ってくれる人はいますか?

これが私の入力文字列です。正規表現は、終了タグ<message Severity="Error">Password will expire in 30 daysが見つかるまで、任意の文字 (改行文字も含む)で始まる文字列と一致する必要があります。</message>正規表現が一致するパターンを見つけた場合、それを空の文字列に置き換える必要があります。

入力文字列:

<message Severity="Error">Password will expire in 30 days.
Please update password using following instruction.
1. login to abc
2. change password.
</message>
4

3 に答える 3

4

使用できますLINQ2XMLが、必要に応じてregex

<message Severity="Error">Password will expire in 30 days.*?</message>(?s)

また

linq2Xml で

XElement doc=XElement.Load("yourXml.xml");

foreach(var elm in doc.Descendants("message"))
{
    if(elm.Attribute("Severity").Value=="Error")
        if(elm.Value.StartsWith("Password will expire in 30 days"))
        {
            elm.Remove();
        }
}
doc.Save("yourXml");\\don't forget to save :P
于 2013-04-23T19:16:16.937 に答える
2

このアプローチには異論があることは知っていますが、これは私にとってはうまくいきます。(ドットが改行に一致できるようにする RegexOptions.SingleLine がおそらく欠落していると思われます。)

string input = "lorem ipsum dolor sit amet<message Severity=\"Error\">Password will    expire in 30 days.\nPlease update password using following instruction.\n"
        + "1. login to abc\n\n2. change password.\n</message>lorem ipsum dolor sit amet <message>another message</message>";

string pattern = @"<message Severity=""Error"">Password will expire in 30 days.*?</message>";

string result = Regex.Replace(input, pattern, "", RegexOptions.Singleline | RegexOptions.IgnoreCase);

//result = "lorem ipsum dolor sit ametlorem ipsum dolor sit amet <message>another message</message>"
于 2013-04-23T19:12:05.587 に答える
2

コメントで述べたように、XML解析の方が適している場合があります。また、達成しようとしているものによっては、これが最善の解決策ではない場合があります。しかし、これで単体テストに合格しました-あなたはそれを理解できるはずです。

[TestMethod]
public void TestMethod1()
{
    string input = "<message Severity=\"Error\">Password will expire in 30 days.\n"
                    +"Please update password using following instruction.\n"
                    +"1. login to abc\n"
                    +"2. change password.\n"
                    +"</message>";
    input = "something other" + input + "something else";

    Regex r = new Regex("<message Severity=\"Error\">Password will expire in 30 days\\..*?</message>", RegexOptions.Singleline);
    input = r.Replace(input, string.Empty);

    Assert.AreEqual<string>("something othersomething else", input);
}
于 2013-04-23T19:16:01.433 に答える