如何用新的GUID替换子字符串000-000

时间:2015-04-02 15:19:17

标签: c# regex xml

我需要更换所有" 0000-000"带有新GUID的字符串。所以每个" 0000-000"在字符串中应该有一个新的GUID。到目前为止,我已经能够用一个新的GUID替换所有GUID。这是一个非常基本的代码:

private string ReplaceGuids(string xmlContent)
{
    string fakeGuid = "00000000-0000-0000-0000-000000000000";
    xmlContent = @"<!--<workflow id=""00000000-0000-0000-0000-000000000000"">--><!--<workflow id=""00000000-0000-0000-0000-000000000000"">-->";

    //Method 1: replaces all 000000-00000 with the same new GUID
    xmlContent = xmlContent.Replace(fakeGuid, Guid.NewGuid().ToString().ToUpper());

    //Method 2: also replacs all 0000-00000 with the same GUID
    int pos = -1;
    do
    {
        pos = xmlContent.IndexOf(fakeGuid);
        if (pos > 0)
        {
            xmlContent = xmlContent.Replace(fakeGuid, Guid.NewGuid().ToString().ToUpper());
        }

    } while (pos > 0);

    return xmlContent;
}

我之前使用过RegEx但不确定如何让每个000-000获得不同的新GUID。谢谢!

2 个答案:

答案 0 :(得分:4)

您可以将Regex.Replace方法与带有匹配评估程序的重载一起使用,以便您可以为每个匹配创建一个新的替换字符串。

在替换特定字符串时,请使用Regex.Escape方法将其中任何具有特殊含义的字符转义为模式。

xmlContent = Regex.Replace(
  xmlContent,
  Regex.Escape(fakeGuid),
  m => Guid.NewGuid().ToString().ToUpper()
);

如果你没有使用Replace将GUID放在字符串中,你的第二种方法也会有用,但是使用Substring来获取要替换的部分之前和之后的部分: / p>

int pos = -1;
do {
  pos = xmlContent.IndexOf(fakeGuid);
  if (pos > 0) {
    xmlContent =
      xmlContent.Substring(0, pos) +
      Guid.NewGuid().ToString().ToUpper() +
      xmlContent.Substring(pos + fakeGuid.Length);
  }
} while (pos > 0);

答案 1 :(得分:0)

使用此:

^0{8}-0{4}-0{4}-0{4}-0{12}$

或(仅用于“0”和“ - ”):

^[0-]+$

使用旗帜MultiLine

See match demo

See replace test