我遇到的问题如下。
我的问题的根本原因是“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}");
无法按预期工作。所以我试图找到一种方法让替换工作正常,忽略空白,但我不知道如何开始...思考?
答案 0 :(得分:1)
string s = "This <tag id=\"1\">string <inner><tag></tag></inner></tag> is <p>inside <b>of</b> another</p> string";
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));
没有得到任何方便的东西,但我怀疑你可能不得不在它之后搞乱选择器,并得到它的孩子(文本节点)