C# Regex-仅替换表达式的最后一部分

C# Regex-仅替换表达式的最后一部分,c#,regex,C#,Regex,我试图找到找到特定模式的最佳方法,然后 替换图案的结束部分。下面是一个简单的例子(用C#): //查找任何以括号或下划线开头的年份值 string patternToFind = "[[_]2007"; Regex yearFind = new Regex(patternToFind); //我想将这些值中的任何一个更改为x2008,其中x是文本中最初的括号或下划线。我试图使用Regex.Replace(),但无法确定是否可以应用它 如果其他方法都失败了,我可以使用MatchCollecti

我试图找到找到特定模式的最佳方法,然后 替换图案的结束部分。下面是一个简单的例子(用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
}

您的模式无法按所述工作:如上所述,您需要从“
\[\124;
”(管道表示或)开始,而实际问题的解决方案是正则表达式分组。将您感兴趣的模式部分用括号括起来(“and”)”,您可以在替换程序中访问它们

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

编辑:.NET代码

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

n、 b.误解了要求,修改了模式。您的模式不能按描述工作:如上所述,您需要以“
\[\124;
”(管道表示OR)开头,实际问题的解决方案是正则表达式分组。将您感兴趣的模式部分括在括号中(“and”)”您可以在替换程序中访问它们

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

编辑:.NET代码

string s = Regex.Replace(source, @"^(\[|_)2007", @"$12008");
n、 b.误解了要求,修改了模式以显示替换(在本例中使用vim)。如果我有一个包含以下内容的文件:

aaa _2007
bbb , 2007
ccc [2007]
我使用正则表达式

:1,$ s/\([_[ ]\)\(2007\)/\12008/g
第一组(在(,)中)将匹配前一年的字符,第二组将匹配2007年的字符。替换将替换第一组中的字符,并覆盖第二组与2008年匹配的字符,给出:

aaa _2008
bbb , 2008
ccc [2008]
不同的正则表达式库在这个原则上会有一些小的语法变化。

显示替换(在本例中使用vim)。如果我有一个包含以下内容的文件:

aaa _2007
bbb , 2007
ccc [2007]
我使用正则表达式

:1,$ s/\([_[ ]\)\(2007\)/\12008/g
第一组(在(,)中)将匹配前一年的字符,第二组将匹配2007年的字符。替换将替换第一组中的字符,并覆盖第二组与2008年匹配的字符,给出:

aaa _2008
bbb , 2008
ccc [2008]

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

您可以将要保留的部分用括号括起来,以创建一个子匹配组。然后在替换文本中,使用backreference将其放回。如果我理解您正试图正确执行的操作,您可以执行以下操作:

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

“1美元”在替换文本中,将替换为括号内匹配的任何内容。

您可以将要保留在括号内的零件换行,以创建子匹配组。然后在替换文本中,使用backreference将其放回。如果我理解您正试图正确执行的操作,您可以执行以下操作:

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

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

分组无疑是解决方案。这将更接近要求的内容:字符串s=Regex.Replace(来源,@“([[u])2007”,@“$12008”);分组无疑是解决方案。这将更接近要求的结果:字符串s=Regex.Replace(来源,@“([[u])2007”,“@“$12008”);