查找字符串中的单词并将其替换

时间:2019-04-01 08:50:26

标签: c# regex

我有一个字符串[XML],我想查找包含一个单词的标签,然后用另一个名称替换该标签。

我尝试使用此方法,但没有成功:

var regex = new Regex(@"\bKeyValueOfstringOutcome\b", RegexOptions.IgnoreCase);
string result = regex.Replace(xml.Document.ToString(), "");

这是我的XML:

<Response>
  <Outcome>
    <KeyValueOfstringOutcomeTest1>
      <Key>Icon</Key>
      <Value>
        <DataType>System.String</DataType>
        <Field>Icon</Field>
        <Value>O</Value>
      </Value>
    </KeyValueOfstringOutcomeTest1>
    <KeyValueOfstringOutcomeTest2>
      <Key>IconDescription</Key>
      <Value>
        <DataType>System.String</DataType>
        <Field>IconDescription</Field>
        <Value>Old</Value>
      </Value>
    </KeyValueOfstringOutcomeTest2>
    <KeyValueOfstringOutcomeTest3>
      <Key>IconLongDescription</Key>
      <Value>
        <DataType>System.String</DataType>
        <Field>IconLongDescription</Field>
        <Value>Older</Value>
      </Value>
    </KeyValueOfstringOutcomeTest3>
  </Outcome>
</Response>

我需要找到包含KeyValueOfstringOutcome的节点,并将KeyValueOfstringOutcomeTest1,KeyValueOfstringOutcomeTest2,KeyValueOfstringOutcomeTest3替换为KeyValueOfstringOutcome。

5 个答案:

答案 0 :(得分:0)

如果有帮助,请尝试此操作。

string result = Regex.Replace(xml.Document.ToString(), "[a-zA-Z0-9]*KeyValueOfstringOutcome[a-zA-Z0-9]*","KeyValueOfstringOutcome");

答案 1 :(得分:0)

如果我正确地理解了您想要摆脱Test1Test2等的问题。 我建议使用此Replace方法。

string replacedXML = Regex.Replace(xml.Document.ToString(),
                                   @"KeyValueOfstringOutcomeTest\d+",
                                    "KeyValueOfstringOutcome");

\d+将匹配出现在关键字后面的1个或多个数字

答案 2 :(得分:0)

我不会使用REGEX来匹配和更改节点的名称。 如果您曾经更新文件或命名,它将崩溃或更改包含流行语的其他节点。

因此,我将在要更改的lvl /层次结构中通过每个childnode创建一个循环,然后对其进行抓取并重命名。

foreach (XmlNode node in doc.ChildNodes)
{        
    // [2] should be the the deepth of childenotes named `KeyValueOfstringOutcomeTestX`
    node.ChildNode[2].Name = "YOUR NEW NAME TO THIS NODE";  
}
doc.Save();  // Change renamed nodes to the document.

答案 3 :(得分:0)

使用xml linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication107
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            List<XElement> keyValueOfstringOutcomeTests = doc.Descendants().Where(x => x.Name.LocalName.StartsWith("KeyValueOfstringOutcomeTest")).ToList();
            foreach (XElement keyValueOfstringOutcomeTest in keyValueOfstringOutcomeTests)
            {
                keyValueOfstringOutcomeTest.ReplaceWith(new XElement("KeyValueOfstringOutcomeTest", keyValueOfstringOutcomeTest.Elements()));
            }
        }
    }
}

答案 4 :(得分:0)

这就是我要做的。

var match = Regex.Match(xml.Document.ToString(), @"KeyValueOfstringOutcome.*>");
                if (match.Success)
                {
                    var replacedText = Regex.Replace(xml.Document.ToString(), @"KeyValueOfstringOutcome.*>", "KeyValueOfstringOutcome>");
                }