C#学习教程:正则表达式替换计数(C#)例如Regex.Replace("aaa","a","b");我想得到3号(结果是“bbb”);对于Regex.Replace("aaa","(?aa?)","${test}b");我想获得2号(结果是“aabab”)。我能想到的方法是这样做:使用MatchEvaluator来增加捕获的变量,手动进行替换获取MatchCollection并对其进行迭代,手动进行替换并保持计数优先搜索并获取MatchCollection,获取计数从它开始,然后单独进行替换方法1和2需要手动解析$replace,方法3需要正则表达式匹配字符串两次。有没有更好的办法。感谢Chevex和Guffa。我开始寻找一种更好的方法来获取结果,发现Match类上有一个Result方法来执行替换。这是拼图中缺失的一块。示例代码如下:usingSystem.Text.RegularExpressions;namespaceregexrep{classProgram{staticintMain(string[]args){stringfileText=System.IO.File.ReadAllText(args[0]);int匹配计数=0;stringnewText=Regex.Replace(fileText,args[1],(match)=>{matchCount++;returnmatch.Result(args[2]);});System.IO.File.WriteAllText(args[0],newText);返回匹配计数;}}}使用包含aaa的文件test.txt,命令行regexreptest.txt"(?aa?)"${test}b将%errorlevel%设置为2并将文本更改为aabab。您可以使用为每个替换运行的MatchEvaluator,这样您就可以计算它发生了多少次:intcnt=0;字符串结果=Regex.Replace("aaa","a",m=>{cnt++;return"b";});第二种情况比较棘手,因为您必须产生与替换模式相同的结果:intcnt=0;字符串结果=Regex.Replace("aaa","(?aa?)",m=>{cnt++;returnm.Groups["test"]+"b";});这应该可以解决问题。整数计数=0;stringtext=Regex.Replace(text,@"(((http|ftp|https)://|www.)[w-_]+(.[w-_]+)+([w-.,@?^=%&:/~+#]*[w-@?^=%&/~+#])?)",//Exampleexpression.这个捕获URLs.match=>{stringreplacementValue=String.Format("https://stackoverflow.com/questions/4994225/count-regex-replaces-c/{0}",match.Value);count++;returnreplacementValue;});我不在我的开发计算机上,所以我现在不能这样做,但我稍后会尝试看看是否有一种方法可以使用lambda表达式来执行此操作,而不是声明方法IncrementCount()只是为了递增一个整数。编辑更改为使用lambda表达式而不是声明另一种方法。EDIT2如果您事先不知道模式,您仍然可以获得匹配对象(您引用的$group)中的所有分组,因为它们包含在GroupCollection中。像这样:以上就是C#学习教程:计数正则表达式替换(C#)分享的全部内容。如果对大家有用,需要详细了解C#学习教程,希望大家多多关注——intcount=0;stringtext=Regex.Replace(text,@"(((http|ftp|https)://|www.)[w-_]+(.[w-_]+)+([w-.,@?^=%&:/~+#]*[w-@?^=%&/~+#])?)",//Exampleexpression.这个捕获URLs.match=>{stringreplacementValue=String.格式("https://stackoverflow.com/questions/4994225/count-regex-replaces-c/{0}",match.Value);count++;foreach(Groupginmatch.Groups){g.Value;//用g.Value做事}returnreplacementValue;});本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
