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 回答