正则表达式 - 仅替换表达式的最后一部分

时间:2008-12-03 16:13:43

标签: c# regex

我正试图找到找到特定模式的最佳方法然后 替换模式的结尾部分。这是一个快速示例(在C#中):

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

string patternToFind = "[[_]2007";

Regex yearFind = new Regex(patternToFind);

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

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

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

3 个答案:

答案 0 :(得分:5)

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

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

编辑:.NET代码

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

aaa _2007
bbb , 2007
ccc [2007]

我使用正则表达式

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

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

aaa _2008
bbb , 2008
ccc [2008]

不同的正则表达式库在此原则上会有轻微的语法变体。

相关问题