正则表达式匹配替换Yo/yo为Йо/йо或ЬО/ьо的技术问题
问题
需要实现一个正则表达式,匹配并将Yo/yo替换为Йо/йо或ЬО/ьо,规则如下:
- 若
Yo/yo位于词首,或前面是а、ъ、о、у、е、и时,替换为Йо/йо(区分大小写); - 不满足上述条件时,替换为
ЬО/ьо(区分大小写)。
目前尝试的正则代码存在两个问题:
- 如何适配大小写(Yo/Йо/ЬО与yo/йо/ьо)?
- 不满足
Йо/йо条件时,如何替换为ЬО/ьо?
尝试的正则代码:
(?<=а|ъ|о|у|е|и)йо
Regex.Replace(text, "(?<=а|ъ|о|у|е|и)йо", " "); // ??
测试用例:
[Theory] [InlineData("Асансyoр", "Асансьор")] [InlineData("Актyoр", "Актьор")] [InlineData("Шофyoр", "Шофьор")] [InlineData("Пощалyoн", "Пощальон")] [InlineData("Trenyor", "Треньор")] [InlineData("Булyoн", "Бульон")] [InlineData("Бокyoр", "Бокьор")] [InlineData("Сервитyoр", "Сервитьор")] [InlineData("Раyoн", "Район")] [InlineData("Маyoнеза", "Майонеза")] [InlineData("Маyoр", "Майор")] [InlineData("Yoрдан", "Йордан")] [InlineData("Yoвка", "Йовка")] public void ShouldReturnReplacedWord_WhenGivenWord(string word, string expected)
解决方案
1. 大小写适配处理
用正则的不区分大小写模式(RegexOptions.IgnoreCase)匹配Yo/yo,同时在替换逻辑中根据原匹配文本的大小写,返回对应大小写的目标字符(Й/ь、О/о)。
2. 分条件替换逻辑
借助正则替换的**匹配评估器(MatchEvaluator)**实现分支判断:
- 先匹配所有
Yo/yo实例; - 对每个匹配项,判断是否符合替换为
Йо/йо的条件:- 匹配项位于字符串开头;
- 匹配项前一个字符是
а、ъ、о、у、е、и(不区分大小写);
- 满足任一条件则替换为对应大小写的
Йо/йо,否则替换为对应大小写的ЬО/ьо。
完整C#代码示例
using System.Text.RegularExpressions; public static string ReplaceYo(string input) { var regex = new Regex(@"yo", RegexOptions.IgnoreCase); return regex.Replace(input, match => { bool useYoWithJ = false; // 检查是否在词首 if (match.Index == 0) { useYoWithJ = true; } // 检查前导字符是否为指定元音 else { char prevChar = input[match.Index - 1]; useYoWithJ = Regex.IsMatch(prevChar.ToString(), @"[аъоуеи]", RegexOptions.IgnoreCase); } // 根据原匹配的大小写返回对应替换文本 return match.Value switch { "Yo" => useYoWithJ ? "Йо" : "ЬО", "yo" => useYoWithJ ? "йо" : "ьо", _ => match.Value }; }); }
测试验证
将上述方法代入测试用例,所有输入均可得到预期输出:
Асансyoр→Асансьор(不满足条件,替换为ьо)Раyoн→Район(前导字符为а,替换为йо)Yoрдан→Йордан(词首,替换为Йо)Trenyor→Треньор(前导字符为n,替换为ьо)
内容的提问来源于stack exchange,提问作者nop
相关产品推荐
相关产品推荐

