当前位置: 首页 > 知识库问答 >
问题:

用正则表达式或/和C替换括号和引号外的所有逗号#

吕高雅
2023-03-14

我需要替换括号和引号外的所有逗号

仅考虑括号替换,我有以下正则表达式,(?![^(]*\)

我做了下面的正则表达式,在一个组中选择括号和引号内的内容,在另一个组中选择括号外的逗号,但我没有找到一种简单的方法来只替换一个组的字符串((?:\(?)?

我想要的是把这个输入

ISNULL(d. Type,0), d. subject','d. name, d. that,array_position(ARRAY['f','p','i','a']::varchar[],x_field), test

并且有这个结果

ISNULL(d.Type,0)DESC,d.Subject','d.Name DESC,d.Something DESC,数组位置(数组['f',p',i',a']::varchar[],x_字段)DESC,test


共有3个答案

闾丘晨
2023-03-14

我怀疑如果Regex是一个很好的工具来完成这个任务:如果你在引号中有括号呢?

abc + '(' + def, pqr + ')'

您需要一个简单但简单的解析器。让我们将其实现为一个有限状态机:

private static string MyReplace(string value) {
  if (string.IsNullOrEmpty(value))
    return value;

  StringBuilder sb = new StringBuilder(value.Length * 2);

  // if we are within quotation
  bool inQuot = false;
  // if we are within parenthesis (note, they can be nested)
  int parenthesis = 0;

  foreach (char c in value) {
    if (c == ',' && !inQuot && parenthesis == 0) 
      sb.Append(" DESC,");
    else
      sb.Append(c);

    // Possible states changing
    if (c == '\'')
      inQuot = !inQuot;
    if (!inQuot && c == '(')
      parenthesis += 1;
    if (!inQuot && c == ')')
      parenthesis -= 1;
  }

  return sb.ToString();
}
慕宏峻
2023-03-14

我想我应该有一个简单的状态机风格的解释。。

bool inBra = false;
bool inQuo = false;

var sb = new StringBuilder();

foreach(char c in str){
  if(c == '(')
    inBra = true;

  if(c == ')')
    inBra = false;

  if(c == '\'')
    inQuo = !inQuo;

  if(c == ',' && !inBra && !inQuo)
    sb.Append(" DESC,");
  else
    sb.Append(c);
}

您可以通过使bool成为一个int来处理嵌套,当它为0时,只有DESC

姬俊能
2023-03-14

你可以用

Regex.Replace(text, @"(\([^()]*\)|'[^']*')|\s*,", m => 
    m.Groups[1].Success ? m.Value : " DESC,")

详情:

  • -组1开始(需要捕获组在随后的结果字符串中恢复匹配):
    • \([^()]*\)-a字符,然后是除之外的任何零个或多个字符,然后是一个字符
    • '[^']*'-''之外的零个或多个字符,以及'char

    请参阅C#演示:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text.RegularExpressions;
    
    public class Test
    {
        public static void Main()
        {
            var text = "ISNULL(d.Type, 0), d.Subject + ', ' + d.Name, d.Something,array_position(ARRAY['f', 'p', 'i', 'a']::varchar[], x_field), test";
            var pattern = @"(\([^()]*\)|'[^']*')|\s*,";
            var result = Regex.Replace(text, pattern, m => m.Groups[1].Success ? m.Value : " DESC,");
            Console.WriteLine(result);
        }
    }
    

    输出:

    ISNULL(d.Type, 0) DESC, d.Subject + ', ' + d.Name DESC, d.Something DESC,array_position(ARRAY['f', 'p', 'i', 'a']::varchar[], x_field) DESC, test
    

 类似资料:
  • 我试图匹配,使用正则表达式,所有逗号(后跟一个空格):在任何括号或方括号之外,即逗号不应该包含在括号或方括号中。 目标字符串是。在这种情况下,它应该匹配第一个逗号和最后一个逗号(介于和之间,和)。 所以我可以拆分分成,and,不会因此而使括号/括号不平衡。 为此,似乎很难单独使用正则表达式。有没有其他办法解决这个问题? 我使用的正则表达式: 但是这个表达式将匹配另外两个不应该匹配的逗号(第二个和第

  • 我有一根绳子 我想用逗号分隔,但需要排除括号和引号内的逗号(单引号和双引号)。 这样地

  • 本文向大家介绍使用JS正则表达式 替换括号,尖括号等,包括了使用JS正则表达式 替换括号,尖括号等的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇使用JS正则表达式 替换括号,尖括号等就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我有一个应用程序收到一个格式错误的JSON字符串,如下所示: null 也可能是格式错误的JSON字符串: 在本例中,不应替换消息值中的单引号。

  • 我需要替换以下字符串中的引号。 最终输出应该是“这是test()ing和test()ing”; i、 e仅当它以“test()开头,以”结尾时才替换。中间的文本保持不变。 这个坏了。 请为同样的问题推荐合适的正则表达式。

  • 我有一个输入字符串,里面有括号,外面有双引号。这些括号可以嵌套。我想去掉只有在双引号外才有括号的字符串。 我尝试了这个正则表达式这将获取包含在圆括号内的所有内容,无论双引号内外。 我得到的实际输出是: 我预计产出为: