You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式匹配替换Yo/yo为Йо/йо或ЬО/ьо的技术问题

问题

需要实现一个正则表达式,匹配并将Yo/yo替换为Йо/йо或ЬО/ьо,规则如下:

  • 若Yo/yo位于词首,或前面是а、ъ、о、у、е、и时,替换为Йо/йо(区分大小写);
  • 不满足上述条件时,替换为ЬО/ьо(区分大小写)。

目前尝试的正则代码存在两个问题:

  1. 如何适配大小写(Yo/Йо/ЬО与yo/йо/ьо)?
  2. 不满足Йо/йо条件时,如何替换为ЬО/ьо?

尝试的正则代码:

(?<=а|ъ|о|у|е|и)йо
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 03:55:25