我有一个表示动作的字符串, 动作中的每个arg都由char';'分隔, 对于每个arg,我想用char'替换char','。'但只有','不在'使用正则表达式替换
之间例如:
1- "ActionName('1,b';1,2)"
2- "ActionName('a,b';1,2;1.2;'1,3')"
欲望结果:
1- "ActionName('1,b';1.2)"
2- "ActionName('a,b';1.2;1.2;'1,3')
条件:
','可以在字符串中多次出现。
我很好地将字符串拆分为';'循环遍历所有部分和每个部分,我将其拆分为'\''。
示例代码:
public string Transform(string expression)
{
string newExpression = string.Empty;
string[] expParts = expression.Split(';');
for (int i = 0; i < expParts.Length; i++)
{
string newSubExpression = string.Empty;
string[] subExpParts = expParts[i].Split(new char[] { '\'' });
for (int subIndex = 0; subIndex < subExpParts.Length; subIndex += 2)
{
newSubExpression += subExpParts[subIndex].Replace(',', ".");
if (subIndex < subExpParts.Length - 1)
newSubExpression += "\'" + subExpParts[subIndex + 1] + "\'";
}
newExpression += newSubExpression;
if (i < expParts.Length - 1)
newExpression = newExpression + ",";
}
return newExpression;
}
答案 0 :(得分:0)
您可以使用(?<=^([^']|'[^']*')*),
var myPattern= "(?<=^([^']|'[^']*')*),";
var regex = new Regex(myPattern);
var result = regex.Replace("ActionName('a,b';1,2;1.2;'1,3')", ".");
输出
ActionName('a,b';1.2;1.2;'1,3')
答案 1 :(得分:0)
由于您已将问题标记为正则表达式,因此我发布了适合您输入的正则表达式(至少您发布的内容):
(,(?![\w\d]*'))
举一个例子,我认为它可以作为一个起点对你有用......
您需要将匹配的正则表达式替换为。,在C#中,您可以这样做:
result = Regex.Replace(input, @"(,(?![\w\d]*'))", @".");
请查看regex lookaround文档以获取更多信息。
答案 2 :(得分:0)
一个简单的 FSM (有限状态机)就行了。请注意,我们只有两个状态(用inQuotation
编码):我们是否在引用的块中。
public static string Transform(string expression) {
if (string.IsNullOrEmpty(expression))
return expression; // Or throw ArgumentNullException
StringBuilder sb = new StringBuilder(expression.Length);
bool inQuotation = false;
foreach (char c in expression)
if (c == ',' && !inQuotation)
sb.Append('.');
else {
if (c == '\'')
inQuotation = !inQuotation;
sb.Append(c);
}
return sb.ToString();
}
试验:
string[] tests = new string[] {
"ActionName('1,b';1,2)",
"ActionName('a,b';1,2;1.2;'1,3')",
};
var result = tests
.Select((line, index) => $"{index + 1}- {Transform(line)}");
Console.WriteLine(string.Join(Environment.NewLine, result));
结果:
1- ActionName('1,b';1.2)
2- ActionName('a,b';1.2;1.2;'1,3')