在 C# 中替换文本,同时保持大小写不变

2024-06-19

我有一组句子需要用来进行替换,例如:

abc => cde
ab df => de
...

我有一个文本可以在哪里进行更改。 但是我无法事先知道所述文本的大小写。 因此,举例来说,如果我有:

A bgt abc hyi. Abc Ab df h

我必须更换并获得:

A bgt cde nyi. Cde De h

或者尽可能接近,即保持大小写

EDIT:由于我看到对此有很多困惑,我将尝试澄清一下:

我问的是一种在更换后保留大写字母的方法,我认为这种方法没有很好地通过(没有很好地解释这意味着什么),所以我将使用真实的单词给出一个更现实的例子。

把它想象成一个词汇表,用它们的同义词替换表达式,可以这么说,所以如果我映射:

didn't achieve success => failled miserably

然后我得到作为输入的句子:

As he didn't achieve success, he was fired

我会得到

As he failled miserably, he was fired

但如果没有大写,那么就会失败,如果成就或成功大写,那么就会很糟糕,如果有超过 1 个字母大写,那么它的对应部分也会大写

我的主要可能性是(我真正想考虑的)

  • 仅第一个单词的第一个字母大写
  • 仅每个单词的第一个字母大写
  • 所有字母均大写

如果我能处理这三个,我想这已经是可以接受的了 - 这是更容易的 - 当然,如果有的话,更深入的解决方案会更好

有任何想法吗?


不确定这会有多好,但这就是我想出的:

        string input = "A bgt abc hyi. Abc Ab df h";
        Dictionary<string, string> map = new Dictionary<string, string>();
        map.Add("abc", "cde");
        map.Add("ab df", "de");

        string temp = input;
        foreach (var entry in map)
        {
            string key = entry.Key;
            string value = entry.Value;
            temp = Regex.Replace(temp, key, match =>
            {
                bool isUpper = char.IsUpper(match.Value[0]);

                char[] result = value.ToCharArray();
                result[0] = isUpper
                    ? char.ToUpper(result[0])
                    : char.ToLower(result[0]);
                return new string(result);
            }, RegexOptions.IgnoreCase);
        }
        label1.Text = temp; // output is A bgt cde hyi. Cde De h

EDIT阅读修改后的问题后,这是我修改后的代码(事实证明,步骤与@Sephalia的代码类似......以及类似的变量名称 lol )

现在的代码有点复杂..但我认为还可以

        string input = 
        @"As he didn't achieve success, he was fired.
        As he DIDN'T ACHIEVE SUCCESS, he was fired.
        As he Didn't Achieve Success, he was fired.
        As he Didn't achieve success, he was fired.";
        Dictionary<string, string> map = new Dictionary<string, string>();
        map.Add("didn't achieve success", "failed miserably");


        string temp = input;
        foreach (var entry in map)
        {
            string key = entry.Key;
            string value = entry.Value;
            temp = Regex.Replace(temp, key, match =>
            {
                bool isFirstUpper, isEachUpper, isAllUpper;

                string sentence = match.Value;
                char[] sentenceArray = sentence.ToCharArray();

                string[] words = sentence.Split(' ');

                isFirstUpper = char.IsUpper(sentenceArray[0]);

                isEachUpper = words.All(w => char.IsUpper(w[0]) || !char.IsLetter(w[0]));

                isAllUpper = sentenceArray.All(c => char.IsUpper(c) || !char.IsLetter(c));

                if (isAllUpper)
                    return value.ToUpper();

                if (isEachUpper)
                {
                    // capitalize first of each word... use regex again :P
                    string capitalized = Regex.Replace(value, @"\b\w", charMatch => charMatch.Value.ToUpper());
                    return capitalized;
                }


                char[] result = value.ToCharArray();
                result[0] = isFirstUpper
                    ? char.ToUpper(result[0])
                    : char.ToLower(result[0]);
                return new string(result);
            }, RegexOptions.IgnoreCase);
        }
        textBox1.Text = temp; 
        /* output is :
        As he failed miserably, he was fired.
        As he FAILED MISERABLY, he was fired.
        As he Failed Miserably, he was fired.
        As he Failed miserably, he was fired.
        */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中替换文本,同时保持大小写不变 的相关文章

  • C++ 指针数组

    Code include stdafx h include
  • DLL版本不匹配问题

    问题简介 我正在使用一个使用 Net 框架的软件来执行一些任务 我们正在尝试使用 Mailkit dll 文件 但在使用它时我们遇到以下消息 内部 无法执行代码阶段 因为代码阶段引发异常 无法加载文件或程序集 System Memory V
  • 使用内联函数有什么问题?

    虽然在某些情况下使用内联函数会非常方便 内联函数有什么缺点吗 结论 显然 使用内联函数没有任何问题 但值得注意的是以下几点 过度使用内联实际上会使程序变慢 根据函数的大小 内联它可能会导致代码大小增加或减少 内联一个非常小的访问器函数通常会
  • 使用enable_if作为模板参数的模板类方法定义

    I asked 这个问题 https stackoverflow com q 9652531 368599早些时候在哪里一个办法 https stackoverflow com a 9652733 368599被提出 就问题而言 解决方案很
  • C++ 用宏替换函数

    我们的 C 代码中有一个现有的函数实现 void Function int param printf In Function n int main Function 10 return 0 我希望将其更改为调用另一个函数 通过宏声明的帮助
  • 从 C++ 启动 Windows 照片应用程序以获取文件列表

    我想从 C 启动 Windows 照片应用程序以获取图像文件列表 照片应用程序的问题在于 如果使用 ShellExecute 对于单个文件 启动它 它将禁用下一个和上一个按钮 即使该文件夹包含其他图像也是如此 我尝试使用 IApplicat
  • 未定义的行为真的有助于现代编译器优化生成的代码吗?

    现代编译器不是足够聪明 能够生成快速且安全的代码吗 看下面的代码 std vector
  • 序列化/反序列化和非默认构造函数

    考虑这个类 Persistable public sealed class FileMoveTask TaskBase PersistMember public string SourceFilePath get private set P
  • XPath 查找所有匹配项 C# XmlDocument

    我想弄清楚如何找到字符串中的所有匹配项XmlDocument XmlNodeList results document SelectNodes Products Product fn matches SearchWord 我试图比较inne
  • 使用 CWnd::EnableTooltips() 可以实现多行工具提示吗?

    我正在尝试使我的工具提示成为多行 但我似乎没有太多运气 我在创建 在本例中为编辑框 后直接调用 CWnd EnableTooltips 并处理 TTN NEEDTEXT 消息 我的工具提示显示正确 但仅显示为一行 我尝试将 n 添加到处理
  • 将异步调用变成同步调用

    将异步调用转变为同步有什么好的实践 模式 吗 我有一个第三方库 它的方法都是异步的 要获得几乎任何方法的结果 您必须侦听事件 这将带来一些上下文 基本上它看起来像 service BeginSomething service OnBegin
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • C++ 中本地类中的静态成员变量?

    我知道我们不能宣布static本地类中的成员变量 但其原因尚不清楚 那么请问有人可以解释一下吗 另外 为什么我们不能访问非static函数内部定义的变量 内部已经定义了局部类 直接在局部类成员函数中 在下面给出的代码中 int main i
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 推导指南中的引用和值之间的差异

    考虑类型A template
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 使用 C 语言使用 strftime() 获取缩写时区

    我看过this https stackoverflow com questions 34408909 how to get abbreviated timezone and this https stackoverflow com ques
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U

随机推荐