我的c#代码中有字符串
a,b,c,d,"e,f",g,h
我想用“e f”替换“e,f”,即','在倒置的逗号里面应该用空格替换。
我尝试使用string.split,但它不适用于我。
答案 0 :(得分:3)
好的,我不会想到正则表达式的方法,所以我将提供一个老式的循环方法,它将起作用:
string DoReplace(string input)
{
bool isInner = false;//flag to detect if we are in the inner string or not
string result = "";//result to return
foreach(char c in input)//loop each character in the input string
{
if(isInner && c == ',')//if we are in an inner string and it is a comma, append space
result += " ";
else//otherwise append the character
result += c;
if(c == '"')//if we have hit an inner quote, toggle the flag
isInner = !isInner;
}
return result;
}
注意:此解决方案假设只有一个级别的内部引号,例如,您不能拥有"a,b,c,"d,e,"f,g",h",i,j"
- 因为这只是简单的疯狂!
答案 1 :(得分:2)
对于您只需要匹配一对字母的情况,以下正则表达式将起作用:
string source = "a,b,c,d,\"e,f\",g,h";
string pattern = "\"([\\w]),([\\w])\"";
string replace = "\"$1 $2\"";
string result = Regex.Replace(source, pattern, replace);
Console.WriteLine(result); // a,b,c,d,"e f",g,h
打破模式,它匹配任何存在“X,X”序列的实例,其中X是任何字母,并用相同的序列替换它,字母之间有空格而不是逗号
如果您需要根据需要将其匹配多个字母等,您可以轻松扩展此功能。
如果您可以在引号中包含以逗号分隔的多个字母,则可以执行以下操作。示例文本为a,b,c,d,"e,f,a",g,h
:
string source = "a,b,c,d,\"e,f,a\",g,h";
string pattern = "\"([ ,\\w]+),([ ,\\w]+)\"";
string replace = "\"$1 $2\"";
string result = source;
while (Regex.IsMatch(result, pattern)) {
result = Regex.Replace(result, pattern, replace);
}
Console.WriteLine(result); // a,b,c,d,"e f a",g,h
与第一个相比,它做了类似的事情,但只删除了被引号括起来的字母夹在中的任何逗号,并重复它直到删除所有情况。
答案 2 :(得分:2)
这是一个有点脆弱但简单的解决方案:
string.Join("\"", line.Split('"').Select((s, i) => i % 2 == 0 ? s : s.Replace(",", " ")))
它很脆弱,因为它不能处理在双引号内转义双引号的CSV版本。
答案 3 :(得分:0)
使用以下代码:
string str = "a,b,c,d,\"e,f\",g,h";
string[] str2 = str.Split('\"');
var str3 = str2.Select(p => ((p.StartsWith(",") || p.EndsWith(",")) ? p : p.Replace(',', ' '))).ToList();
str = string.Join("", str3);
答案 4 :(得分:-1)
使用Split()
和Join()
:
string input = "a,b,c,d,\"e,f\",g,h";
string[] pieces = input.Split('"');
for ( int i = 1; i < pieces.Length; i += 2 )
{
pieces[i] = string.Join(" ", pieces[i].Split(','));
}
string output = string.Join("\"", pieces);
Console.WriteLine(output);
// output: a,b,c,d,"e f",g,h