C#-Regex如果不在引号内则替换

C#-Regex如果不在引号内则替换,c#,regex,string,replace,C#,Regex,String,Replace,让我们看一下这段代码: string Val = "I like foo, baz and bar, they where before \"foo, baz and bar\""; string[] first = { "foo", "baz", "bar" }; string[] second = { "java", "php", "ruby" }; 看,在我的Val字符串中有一个文本,我只想替换不在引号(\“”)内的部分,但如果我这样做

让我们看一下这段代码:

string Val = "I like foo, baz and bar, they where before \"foo, baz and bar\"";

string[] first = {
    "foo",
    "baz",
    "bar"
};

string[] second = {
    "java",
    "php",
    "ruby"
};
看,在我的Val字符串中有一个文本,我只想替换不在引号(\“”)内的部分,但如果我这样做了

Val = Regex.Replace(Val, first, second);
它只是让我

I like java, php and ruby, they where before "java, php and ruby"
当我期待的时候

I like java, php and ruby, they where before "foo, baz and bar"

有人能帮我解决这个问题吗?我没有找到任何文档来解释这个问题。

您可以用引号拆分,然后对其他字符串进行替换,然后将这些字符串放在一起:

string[] parts = Val.Split('"');
for (int i = 0; i < parts.Length; i += 2) {
  parts[i] = Regex.Replace(parts[i], first, second);
}
Val = String.Join("\"", parts);
string[]parts=Val.Split(“”);
对于(int i=0;i
您可以在引号上拆分,然后每隔一个字符串进行替换,然后将字符串放在一起:

string[] parts = Val.Split('"');
for (int i = 0; i < parts.Length; i += 2) {
  parts[i] = Regex.Replace(parts[i], first, second);
}
Val = String.Join("\"", parts);
string[]parts=Val.Split(“”);
对于(int i=0;i
为什么不将Val分成两个变量:Val1=“我喜欢foo、baz和bar,它们在前面的位置”和Val2=“\”foo、baz和bar\”“并在将Val1和Val2连接到Val之前替换Val2中的文本。为什么预期会出现这种结果
Regex.Replace
,替换找到的所有匹配项。文档名为“你确定需要正则表达式吗?”?此任务似乎不适合正则表达式。为什么不将Val拆分为两个变量:Val1=“我喜欢foo、baz和bar,它们在何处之前”和Val2=“\“foo、baz和bar\”,并在将Val1和Val2连接到Val之前替换Val2中的文本。为什么预期会出现这种结果
Regex.Replace
,替换找到的所有匹配项。文档名为“你确定需要正则表达式吗?”?这个任务似乎不适合正则表达式。我正在使用
Select
并检查索引是否要替换部分,除非您的引号字符串中有转义引号…:D@Rawling:那就取决于他们是如何逃脱的。如果它们是VB样式的转义,即通过将它们加倍,则这不是问题。:)+一个不错的。我正在使用
Select
并检查索引是否要替换部分,除非您的引号字符串中有转义引号…:D@Rawling:那就取决于他们是如何逃脱的。如果它们是VB样式的转义,即通过将它们加倍,则这不是问题。:)