我正试图找到找到特定模式的最佳方法然后 替换模式的结尾部分。这是一个快速示例(在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
}
答案 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]
不同的正则表达式库在此原则上会有轻微的语法变体。