用正则表达式替换字符串

时间:2012-03-21 17:36:40

标签: c# .net regex

我正在寻找一种方法来替换我在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

4 个答案:

答案 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解析库和一些状态来做这件事。