【问题标题】:Regex - replace only last part of an expression正则表达式 - 仅替换表达式的最后一部分
【发布时间】:2008-12-03 16:13:43
【问题描述】:

我正在尝试寻找找到特定模式的最佳方法,然后 替换模式的结束部分。这是一个简单的例子(在 C# 中):

//查找任何以括号或下划线开头的年份值

string patternToFind = "[[_]2007";

Regex yearFind = new Regex(patternToFind);

//我想将这些值中的任何一个更改为 x2008,其中 x 是文本中最初的括号或下划线。我试图使用 Regex.Replace(),但无法确定它是否可以应用。

如果一切都失败了,我可以使用 MatchCollection 找到匹配项,然后将 2007 值切换为 2008;但是,我希望有更优雅的东西

MatchCollections matches = yearFind.Matches(" 2007 [2007 _2007");
foreach (Match match in matches){
  //use match to find and replace value
}

【问题讨论】:

    标签: c# regex


    【解决方案1】:

    您的模式不像描述的那样工作:如上所述,您需要以“\[|_”(管道表示 OR)开头,而您的实际问题的解决方案是 正则表达式分组。将您感兴趣的模式部分括在括号“(”和“)”中,您可以在替换器中访问它们。

    因此,您需要这样的模式:/^(\[|_)2007/

    编辑:.NET 代码

    string s = Regex.Replace(source, @"^(\[|_)2007", @"$12008");
    

    n.b.误解了要求,修改了模式

    【讨论】:

    • 分组绝对是解决方案。这将更接近要求的内容: string s = Regex.Replace(source, @"([[_])2007", @"$12008");
    【解决方案2】:

    您可以将要保留的部分括在括号中以创建子匹配组。然后在替换文本中,使用反向引用将其放回原处。如果我理解您要正确执行的操作,您将执行以下操作:

    Regex yearFind = new Regex("([[_])2007");
    yearFine.Replace("_2007", @"$12008"); // => "_2008"
    yearFine.Replace("[2007", @"$12008"); // => "[2008"
    

    替换文本中的“$1”被替换为括号内匹配的内容。

    【讨论】:

      【解决方案3】:

      显示替换(在这种情况下使用 vim)。如果我有一个包含以下内容的文件:

      aaa _2007
      bbb , 2007
      ccc [2007]
      

      我使用正则表达式

      :1,$ s/\([_[ ]\)\(2007\)/\12008/g
      

      第一组(在 (, ) 中)将匹配年份之前的字符,第二组将匹配 2007 年。替换在第一个匹配中替换并用 2008 覆盖第二组匹配的任何内容,给予:

      aaa _2008
      bbb , 2008
      ccc [2008]
      

      不同的正则表达式库在这个原则上会有细微的语法变化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-29
        • 1970-01-01
        • 2018-08-18
        • 1970-01-01
        相关资源
        最近更新 更多