我需要替换括号和引号外的所有逗号
仅考虑括号替换,我有以下正则表达式,(?![^(]*\)
我做了下面的正则表达式,在一个组中选择括号和引号内的内容,在另一个组中选择括号外的逗号,但我没有找到一种简单的方法来只替换一个组的字符串((?:\(?)?
我想要的是把这个输入
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
我怀疑如果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();
}
我想我应该有一个简单的状态机风格的解释。。
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
你可以用
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()开头,以”结尾时才替换。中间的文本保持不变。 这个坏了。 请为同样的问题推荐合适的正则表达式。
我有一个输入字符串,里面有括号,外面有双引号。这些括号可以嵌套。我想去掉只有在双引号外才有括号的字符串。 我尝试了这个正则表达式这将获取包含在圆括号内的所有内容,无论双引号内外。 我得到的实际输出是: 我预计产出为: