字符串替换:忽略空格

时间:2012-11-19 22:06:53

标签: c# xml regex string

我遇到的问题如下。

我的问题的根本原因是“XML”解析(XML在引号中,因为在这种情况下,它不是直接的XML)和空格。

我需要能够转换它:

 "This is a <tag>string</tag>"

 "This is a {0}"

它必须能够处理嵌套标签,以及那种东西。我的计划是使用以下内容来获取替换文本。

 var v = XDocument.Parse(string.Format("<root>{0}</root>", myString),LoadOptions.PreserveWhitespace);
 var ns = v.DescendantNodes();
 var n = "" + ns.OfType<XElement>().First(node => node.Name != "root");

该代码返回第一对匹配标记。它可以处理嵌套等。唯一真正的问题是,即使使用“PreserveWhitespace”选项,回车也会被淘汰。 "\r\n"转换为"\n"。这可以防止匹配,所以:

 myString = myString.Replace(n,"{0}");

无法按预期工作。所以我试图找到一种方法让替换工作正常,忽略空白,但我不知道如何开始...思考?

3 个答案:

答案 0 :(得分:1)

输入:

string s = "This <tag id=\"1\">string <inner><tag></tag></inner></tag> is <p>inside <b>of</b> another</p> string";

C#代码:

Match m;
do
{
  m = Regex.Match(s, @"\A([\s\S]*)(<(\S+)[^[<>]*>[^<>]*</\3>)([\s\S]*)\Z");
  if (m.Success) {
    s = m.Groups[1].Value + "{0}" + m.Groups[4].Value;
    System.Console.WriteLine("Match: " + m.Groups[2].Value);
  }
} while (m.Success);
System.Console.WriteLine("Result: " + s);

输出:

Match: <b>of</b>
Match: <p>inside {0} another</p>
Match: <tag></tag>
Match: <inner>{0}</inner>
Match: <tag id="1">string {0}</tag>
Result: This {0} is {0} string

测试此代码 here

答案 1 :(得分:0)

虽然不是最好的解决方案(如果'\n'中只有myString),但值得一试:

myString =  myString.Replace(n.Replace("\n", "\r\n"), "{0}");

答案 2 :(得分:0)

尝试CDATA部分?

v = XDocument.Parse(string.Format("<root><![CDATA[{0}]]></root>", myString));

没有得到任何方便的东西,但我怀疑你可能不得不在它之后搞乱选择器,并得到它的孩子(文本节点)