我有一个表示动作的字符串,操作中的每个参数都由字符";"分隔,对于每个参数,我想用字符"."替换字符",",但前提是","不在"字符之间"使用正则表达式替换
例如:
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;
}
(?<=^([^']|'[^']*')*),
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')
在这里演示
由于您已将问题标记为正则表达式,因此我发布了一个适用于您输入的正则表达式(至少是您发布的内容(:
(,(?![wd]*'))
举个例子,我认为它对你作为起点很有用......
您需要将匹配的正则表达式替换为 .,在 C# 中您可以这样做:
result = Regex.Replace(input, @"(,(?![wd]*'))", @".");
查看正则表达式查找文档以获取更多信息。
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')