如何仅替换不在 c# 中的两个引号之间的字符串
Posted
技术标签:
【中文标题】如何仅替换不在 c# 中的两个引号之间的字符串【英文标题】:How do I replace only strings that are not between two quotes in c# 【发布时间】:2020-08-29 11:45:16 【问题描述】:例如我有字符串:
(一二树“一”五“二”“二”“五”二“六”二六)
我希望输出是:
(一2树“一”五“二”“二”“五”2“六”2六)
string.replace("two", "2"),将替换字符串中的所有“two”,这不是我要找的
【问题讨论】:
string.replace("two", "2").Replace("\"2\"", "\"two\"") 您可以用"
分割字符串,并且只对每个具有偶数索引的子字符串进行替换。并在他们之间加入"
@erno 从理论上讲,这样的字符串会失败:`一二“一二”三......”。OP似乎暗示这不是一个需要解释的场景,但很好指出尽管如此。
感谢回答:string input = "一二树\"一\"五\"二\"\"二\"\"五\"二\"六\"二六" ;字符串模式 = @"(?
【参考方案1】:
您可以创建自己的替换方法,例如:
private void replace()
string str = "one two tree 'one' five 'two' 'two' 'five' two 'six' two six";
string[] strArr = str.Split(' ');
for(int i =0;i<strArr.Length;i++)
if(strArr[i]=="two")
strArr[i] = "2";
str = string.Join(" ", strArr);
return str;
此代码会将字符串拆分为数组并检查索引字符串是否相同,如果包含 (") 则不会考虑它。
【讨论】:
谢谢你的回答,我找到了解决办法。【参考方案2】:您可以通过"
拆分字符串,这将创建一个字符串数组,其中奇数索引上的每个字符串都将用引号括起来。因此,偶数索引上的每个字符串都没有被引用,您可以节省地执行替换。然后将它们与子字符串之间的"
s 重新连接起来。
var str = "one two tree \"one\" five \"two\" \"two\" \"five\" two \"six\" two six";
var strs = str.Split('"');
for (int i = 0; i < strs.Length; i += 2)
strs[i] = strs[i].Replace("two", "2");
【讨论】:
谢谢你的回答,我找到了解决办法。【参考方案3】:如果您想让它更通用一点,除了其他响应之外,您可以遍历所有元素并跳过那些包含在 " 字符中的元素。类似于:
var split = str.Split(' ');
foreach (var el in split)
if (el.StartsWith("\"") && el.EndsWith("\""))
continue;
// do your replace here
差别不大,但至少你的代码更简洁了,因为现在你可以在注释附近做任何你想要的替换,可以肯定元素没有用引号括起来,无论是用 2 替换两个还是任何其他更改.
【讨论】:
谢谢你的回答,我找到了解决办法。【参考方案4】:试试Regex.Replace() + string.Format()
用字符串值(two
,此处)替换占位符 (0
),并在指定的字符串值前面有空格或行首,后跟空格或行尾时匹配输入。
匹配项被另一个字符串替换("2"
,此处):
string input = "one two tree \"one\" five \"two\" \"two\" \"five\" two \"six\" two six";
string pattern = @"(?<=^|\s)0(?=\s|$)";
string result = Regex.Replace(input, string.Format(pattern, "two"), "2");
结果是:
one 2 tree "one" five "two" "two" "five" 2 "six" 2 six
【讨论】:
以上是关于如何仅替换不在 c# 中的两个引号之间的字符串的主要内容,如果未能解决你的问题,请参考以下文章