如果不在字符之间,请替换字符"'"



我有一个表示动作的字符串,操作中的每个参数都由字符";"分隔,对于每个参数,我想用字符"."替换字符",",但前提是","不在"字符之间"使用正则表达式替换

例如:

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')

最新更新