我正在寻找一种方法来替换我在doc-xml文件中调用垃圾文本以替换值
我有这个程序,它可以获取doc-xml来打印合同,用户只需要用doc-xml文件格式提供程序,其中会有一些参数,我的程序将替换为值< / p>
让我说我有这个合约格式的大块
The Contract {@ContractNumber} specified to the contractor {@ContractorName}....
我的程序查找此参数{@ContractNumber}和{@ContractorName}以替换契约值,我只是要求用户以XML-DOC格式提供它,但有时候它会像此
<w:p w:rsidR="0094616E" w:rsidRDefault="00AC620A"><w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/><w:color w:val="000000"/><w:sz w:val="24"/><w:szCs w:val="24"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/><w:color w:val="000000"/><w:sz w:val="24"/><w:szCs w:val="24"/></w:rPr><w:t>{@</w:t></w:r><w:proofErr w:type="spellStart"/><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/><w:color w:val="000000"/><w:sz w:val="24"/><w:szCs w:val="24"/></w:rPr><w:t>ContractorNumber</w:t></w:r>
有时它会做我真正希望的事情
<w:p w:rsidR="0094616E" w:rsidRDefault="0094616E"><w:pPr><w:rPr><w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/><w:color w:val="000000"/><w:sz w:val="24"/><w:szCs w:val="24"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="Times New Roman"/><w:color w:val="000000"/><w:sz w:val="24"/><w:szCs w:val="24"/></w:rPr><w:t>{@Value1}</w:t></w:r></w:p>
那么,我正在寻找一个RegEx替换语句,我可以摆脱在我的参数({@)和它的关闭(})的开放字符之间可以找到的所有垃圾,这样它就可以了找到我希望被分配给它的值替换的整个单词
编辑1:
为了更简单地理解我的问题,我正在寻找一个能够找到{@
和后续}
之间以及找到<>
之间的所有内容的ReGex删除它们中的所有内容,以便我{@Param}
或{@ <garbage/> Param <garbage/> }
或{@Param <garbage/> }
{@Pa <garbage/> am}
编辑2:
到目前为止,最有帮助的正则表达式是这一个
{.*?@.*?}
给我这样的结果
{</w:t></w:r><w:r><w:t>@Contrato</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>Obrigado</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>Adquisicion</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>Import</w:t></w:r><w:r><w:t>e</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>Acreditado</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>ImporteLetras</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>O</w:t></w:r><w:r><w:t>ficio</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>FechaOficio</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>Gracia</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>M</w:t></w:r><w:r><w:t>ensualidad-Gracia</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>ImporteMensualidad</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>I</w:t></w:r><w:r><w:t>mporteMensualidadLetra</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>D</w:t></w:r><w:r><w:t>ireccionAcreditada</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>EdoC</w:t></w:r><w:r><w:t>ivilAcreditado</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>CiudadOri</w:t></w:r><w:r><w:t>genAcredi</w:t></w:r><w:r><w:t>t</w:t></w:r><w:r><w:t>a</w:t></w:r><w:r><w:t>do</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>IFE</w:t></w:r><w:r><w:t>Acreditado</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>Sexo</w:t></w:r><w:r><w:t>Acreditado}
{@</w:t></w:r><w:r><w:t>EdoCivilAval</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>CiudadOrigenAval</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>IFEAval</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>S</w:t></w:r><w:r><w:t>e</w:t></w:r><w:r><w:t>xoAval</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>NumeroAmortizacion</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>DireccionAval</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>ProgramaCredito</w:t></w:r><w:r><w:t>}
{@</w:t></w:r><w:r><w:t>Por</w:t></w:r><w:r><w:t>cComisionAper</w:t></w:r><w:r><w:t>tura</w:t></w:r><w:r><w:t>}
现在,我需要的是正则表达式摆脱所有那些和角色之间的东西,似乎无法找到删除那些的方法:S
答案 0 :(得分:1)
您提供的第一个XML代码块不包含}字符,因此它已经破坏了您的先决条件。但是,如果您真的想要使用上述解决方案,请遵循Jetti的建议;也就是说,生成匹配列表并对每个匹配项执行替换。我会使用正则表达式
@"@{.*?}"
或
@"@{.*?ContractName.*?}"/@"@{.*?ContractorNumber.*?}"
但是你想如何匹配它取决于你和你需要的东西。
编辑1:
在审核了您最近的编辑并更好地了解您正在寻找的内容后,我设计了一个稍微丑陋但功能性的解决方案。任何有权限的人都可以自由清理,但我现在没有时间:
string yourstring = "{@</w:t></w:r><w:r><w:t>Obrigado</w:t></w:r><w:r><w:t>}{@......}...";
Regex reg1 = new Regex(@"{.*?@.*?}");
Regex reg2 = new Regex(@"<.*?>");
MatchCollection matches = reg1.Matches(yourstring);
List<string> names = new List<string>();
foreach (Match match in matches)
{
// yeah.. this could be cleaned up.
names.Add((string)reg2.Replace(match.ToString(), ""));
}
for (int i = 0; i < names.Count; i++)
{
yourstring = yourstring.Replace(matches[i].ToString(), names[i]);
}
我尝试在一个foreach循环中完成所有这些操作,但匹配只是readonly,我想不出一个合理的方法来绕过它,除了第二次运行。我听说过递归Regex方法,但我对它们知之甚少。
答案 1 :(得分:0)
Regex.Replace(sourceString, @"{@ContractName}", myContractName);
Regex.Replace(sourceString, @"{@ContractNumber}", myContractNumber);
请务必在代码顶部加入using System.Text.RegularExpressions;
。
答案 2 :(得分:0)
两种方法。如果要替换的字符串每次都相同,则可以执行
input.Replace("{@ContractNumber}","Actual Number");
如果他们可以随意调用它,那么你可以这样做:
Regex reg = new Regex(@"{@[\w|\d]+}");
string input = "test {@name} this out";
MatchCollection matches = reg.Matches(input);
foreach (Match m in matches)
{
// Look up the value or whatever based on m.Value
Console.WriteLine(m.Value);
}
答案 3 :(得分:0)
你不能只是“摆脱垃圾”并且仍然拥有有效的XML。
以下是此解决方案的一些问题:
<w a="{@">
作为字符串的一部分进行匹配吗?</w>
介于<w>
之间而不是<w>
时,您会怎么做?</w>
介于{{1}}之间而不是{{1}}时,您会怎么做?听起来你要么必须以某种方式清理你的输入,要么使用XML解析库和一些状态来做这件事。