如何只替换不在 c# 中两个引号之间的字符串

How do I replace only strings that are not between two quotes in c#

例如我有字符串:

(一二树"one"五"two""two""five"二"six"二六)

我希望输出为:

(一2树"one"五"two""two""five"2"six"2六)

string.replace("two", "2"),将替换字符串中的所有 "two",而这不是我要找的

您可以创建自己的替换方法,例如:

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;
    }

此代码会将字符串拆分为数组并检查索引字符串是否相同,如果它包含 ("),则不会考虑它。

您可以按 " 拆分字符串,这将创建一个字符串数组,其中奇数索引上的每个字符串都将用引号引起来。所以偶数索引上的每个字符串都没有被引用,您可以安全地执行替换。然后只需将它们与子字符串之间的 "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");
}

如果你想让它更通用一些,除了其他响应之外,你还可以遍历所有元素并跳过那些包含在 " 字符中的元素。类似于:

var split = str.Split(' ');
foreach (var el in split) {
    if (el.StartsWith("\"") && el.EndsWith("\"")) {
        continue;
    }
    // do your replace here
}

没什么大区别,但至少你的代码更简洁了,因为现在你可以在评论附近做任何你想做的替换,确定元素没有用引号引起来,无论是用 2 替换 2 还是任何其他变化。

尝试Regex.Replace() + string.Format()

将占位符 ({0}) 替换为字符串值(此处为 two),并在指定的字符串值前面有 space 或行首时匹配输入然后是 space 或行尾。
匹配项替换为另一个字符串(此处为 "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