如何仅替换不在 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# 中的两个引号之间的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何替换不在引号中的字符串

C# 中的引号字符串替换集

c#中 如何解决xml格式的字符串中特殊字符

oracle 中如何将字符串中的英文单引号替换为右斜杠+英文单引号

替换aspx c#中的引号

如何多次替换两个分隔符/字符串之间的唯一字符串