如果不是“\'”char

时间:2018-04-11 10:23:24

标签: c# regex

我有一个表示动作的字符串, 动作中的每个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;
 }

3 个答案:

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

Demo here

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