【问题标题】:C# string replacement with case duplicationC# 字符串替换与大小写重复
【发布时间】:2015-02-15 01:01:29
【问题描述】:

我正在从事一个有趣的项目,该项目需要以一种不寻常的方式替换字符串。具体来说,结果的大小写必须尽量匹配原始的大小写,并且搜索本身不区分大小写。

例子:

原文:“测试 Foobar 测试” 搜索:“foobar” 替换为:“helloworld” 结果:“测试 Helloworld 测试”

原文:“测试 FOOBAR 测试” 搜索:“foobar” 替换为:“helloworld” 结果:“测试 HELLOWORLD 测试”

现在,我意识到在很多情况下这很难确定(混合大小写匹配与不同的长度替换。)但是如果我将其限制为三种情况:全部大写、全部小写和首字母大写?

到目前为止,我的计划是进行三个搜索:首先对全大写条件进行区分大小写的搜索,然后对首字母条件进行区分大小写的搜索,最后进行不区分大小写的搜索并替换为全部小写。但如果可能的话,我想要更快、更优雅的东西。有什么想法吗?

【问题讨论】:

  • 测试 FooBar 怎么样,应该产生 HelloWorld 吗?您是否尝试过任何字符串操作函数?
  • @lrb 在一个完美的世界中,FooBar 会产生 HelloWorld,但我想不出一种方法来实现它。所以这就是为什么我将它限制在三个特定的情况下。所以 FooBar 会产生 Helloworld。
  • @EZI 我解释了我目前的解决方案,非常简单,不需要代码来理解。

标签: c# regex string replace case-sensitive


【解决方案1】:

我会使用正则表达式进行查找,因为:

  • 正则表达式可以不区分大小写
  • 正则表达式可以返回它找到的匹配集合,您可以单独检查每个匹配项
  • 您采取的行动可以针对每场比赛,一个可能是驼峰式,另一个是全大写

一个好的解决方案可能是将要采取的操作封装为一个方法,然后遍历找到的匹配项,调用该方法,用新文本替换匹配项。

如果您打算保持替换的大写简单,那么您可以只检查第一个字母字符和另一个任意一个 - 如果两者都是大写,则假设结果应该是大写,如果第一个是大写但第二个是小写然后假设驼峰大小写,如果两者都较低,则假设全部小写。当然你可以增加字符的数量来测试两个是否太粗略而不可靠。

【讨论】:

  • 我找不到基于匹配集合替换的方法,但我确实找到了具有 MatchEvaluator 的 Regex.Replace 重载。
【解决方案2】:

我发现需要 MatchEvaluator 的 Regex.Replace 重载。在评估器中,我可以检查匹配字符串的大小写并从那里开始。

另外,正如 slugster 所说,Regex 方法可以选择不区分大小写。

【讨论】:

    猜你喜欢
    • 2014-04-11
    • 1970-01-01
    • 2015-09-12
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    • 2016-12-11
    • 1970-01-01
    相关资源
    最近更新 更多