Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用大小写重复替换C#字符串_C#_Regex_String_Replace_Case Sensitive - Fatal编程技术网

用大小写重复替换C#字符串

用大小写重复替换C#字符串,c#,regex,string,replace,case-sensitive,C#,Regex,String,Replace,Case Sensitive,我正在做一个有趣的项目,需要以一种不同寻常的方式替换字符串。具体来说,结果的大小写必须尝试匹配原始的大小写,搜索本身不区分大小写 示例: 原文:“测试Foobar测试” 搜索:“foobar” 替换为:“helloworld” 结果:“测试Helloworld测试” 原文:“测试FOOBAR测试” 搜索:“foobar” 替换为:“helloworld” 结果:“测试HELLOWORLD测试” 现在,我意识到在很多情况下这很难确定(混合大小写匹配,替换长度不同)。但如果我将其限制为三种情况:全部

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

示例:

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

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

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


到目前为止,我的计划是进行三次搜索:首先对all caps条件进行区分大小写的搜索,然后对First letter条件进行区分大小写的搜索,最后进行不区分大小写的搜索并替换为all lowercase。但如果可能的话,我想要更快更优雅的。有什么想法吗?

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

  • regex可以不区分大小写
  • 正则表达式可以返回它找到的匹配项的集合,您可以单独检查每个匹配项
  • 您所采取的操作可以特定于每个匹配,一个可能是驼峰大小写,而另一个则是全大写
一个好的解决方案可能是将要采取的操作封装为一个方法,然后迭代找到的匹配项,调用该方法,用新文本替换匹配项


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

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


另外,正如slugster所说,Regex方法有一个不区分大小写的选项。

那么test FooBar呢,这会产生HelloWorld吗?你试过任何字符串操作函数吗?@lrb在一个完美的世界里,FooBar会产生HelloWorld,但我想不出一种方法来实现它。这就是为什么我把它限制在三种特定的情况下。所以FooBar会产生Helloworld。@EZI我解释了我当前的解决方案,它非常简单,不需要任何代码就能理解。我找不到一种基于匹配项集合的替换方法,但我确实发现了一个带有匹配计算器的Regex.replace重载。