当前位置: 首页 > 编程语言 > C#

正则表达式替换多个分组分享

时间:2023-04-10 11:31:38 C#

正则表达式替换多个分组我想用正则表达式将多个分组替换成相应的替换字符串。替换表:例如,对于以下输入字符串a1asda&FJ#ahdk5adfls对应的输出字符串是a5asda__ampfj__hshahdk6adfls有没有办法做到这一点?给定一个定义替换的字典:IDictionarymap=newDictionary(){{"&","__amp"},{"#","__hsh"},{"1","5"},{"5","6"},};您可以使用它来构建正则表达式并为每个匹配项形成替换:varstr="a1asda&fj#ahdk5adfls";varregex=newRegex(String.Join("|",map.Keys));varnewStr=regex.Replace(str,m=>map[m.Value]);//newStr=a5asda__ampfj__hshahdk6adfls示例:http://rextester.com/rundotnet?id=a5asda__ampfj__hshahdk6adflscode=ADDN57626这使用Replace(docs)重载,允许您为替换指定lambda表达式。评论中指出,在其中查找具有正则表达式语法的模式将无法按预期工作。这可以通过使用Regex.Escape对上面的代码做一点小改动来克服:varstr="a1asda&fj#ahdk5adfls";varregex=newRegex(String.Join("|",map.Keys.Select(k=>Regex.Escape(k))));varnewStr=regex.Replace(str,m=>map[m.Value]);//newStr=a5asda__ampfj__hshahdk6adfls使用string.Replace()怎么样?stringfoo="a1asda&fj#ahdk5adfls";stringbar=foo.Replace("&","__amp").Replace("#","__hsh").Replace("5","6").Replace("1","5");类似于Jamiec的回答,但这允许您使用不完全匹配文本的正则表达式,例如不会与Jamiec的答案一起使用,因为您无法在字典中查找匹配项。此解决方案依赖于创建组、查找匹配组,然后查找替换值。它更复杂,但更灵活。首先使地图成为KeyValuePairs的列表varmap=newList>();map.Add(newKeyValuePair(".","dot"));然后像这样创建你的正则表达式:stringpattern=String.Join("|",map.Select(k=>"("+k.Key+")"));varregex=newRegex(pattern,RegexOptions.Compiled);然后匹配评估器变得有点复杂:privatestaticstringEvaluator(List>map,Matchmatch){for(inti=0;然后我这样调用正则表达式替换:varnewString=regex.Replace(text,m=>Evaluator(map,m))givenlikeotherThedictionaryintheanswer,youcanuse'aggregate'tomapeachpatterninthedictionarytoareplacement.这会给你比其他答案更大的灵活性,因为你可以有不同的每个模式格式选项的正则表达式。例如,以下代码是“罗马化”希腊文本(https://en.wikipedia.org/w/index.php?title=Romanization_of_Greek§ion=3#Modern_Greek,Standard/UN):varmap=newDictionary(){{"a[yy](?=[aavgdeeziiiiiiilmnooryyyyyo]),"av"},{"a[yy]","af"},{"a[y]","a?"},{"a[yy]]","ai"},{"[аа]","a"},{"β","v"},{"γ(?=[γξx])","n"},{"γ","g"},{"d","d"},{"e[yy](?=[aavgdeeziiiiiiilmnoroyyyyyy])","ev"},{"e[yy]","ef"},{"ei","ei"},{"[ee]","e"},{"z","z"},{"η[yy](?=[ααγγδεεζιιιλμνοριγι?ωω])","iv"},{"i[yy]","if"},{"[iiii]","i"},{"[ii]","?"},{"θ","th"},{"k","k"},{"λ","l"},{"\bμ|μ\b","b"},{"μ","mb"},{"μ""m"},{"ν","n"},{"о[ии]","oi"},{"о[уй]","ou"},{"[оооо]","o"},{"ξ","x"},{"π","p"},{"ρ","r"},{"[σσ]","s"},{"τ","t"},{"[yyyy]","y"},{"?","f"},{"x","ch"},{"ψ","ps"}};var输入映射.聚合(输入,(i,m)=>正则表达式。替换(i,m。键,m。值,RegexOptions.IgnoreCase));返回(不修改“输入”变量:“okalymniossfoungaraspsythiriseposthavoutixeichorisnadistazei。”你当然可以使用以下内容:foreach(地图中的varm)input=Regex.Replace(input,m.Key,m.Value,RegexOptions.IgnoreCase);它确实修改了“输入”变量你也可以添加这个来提高性能:varremap=newDictionary();foreach(varminmap)remap.Add(newRegex(m.Key,RegexOptions.IgnoreCase|RegexOptions.Compiled),m.Value);缓存或者做一个静态重映射字典然后使用:以上是C#学习教程:正则表达式替换多组共享的所有内容,大家都有用,都需要了解更多C#学习教程,希望大家多多关注---remap.Aggregate(input,(i,m)=>m.Key.Replace(i,m.Value));本文来自网络收藏不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处: