我需要替換括號和引號外的所有逗號
要替換僅考慮括號,我有以下 REGEX
,(?![^(]*\))
我制作了以下正則運算式,選擇一組中的括號和引號內的內容以及另一組中括號外的逗號,但我沒有找到一種簡單的方法來僅替換一組中的字串
((?:\((?>[^()]|)*\)|'(?>[^']|)*'))|(,)
示例:我想要的是把這個輸入
ISNULL(d.Type, 0), d.Subject ', ' d.Name, d.Something,array_position(ARRAY['f', 'p', 'i', 'a']::varchar[], x_field), test
并得到這個結果
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
uj5u.com熱心網友回復:
您可以使用
Regex.Replace(text, @"(\([^()]*\)|'[^']*')|\s*,", m =>
m.Groups[1].Success ? m.Value : " DESC,")
詳情:
(- 組 1 開始(捕獲組是稍后在結果字串中恢復匹配所必需的):\([^()]*\)- 一個字符,然后是除and之外的(任何零個或多個字符,然后是一個字符())
|- 或者'[^']*'-',零個或多個除', 和一個'char之外的字符
)- 捕獲組結束|- 或者\s*,- 零個或多個空格,然后是一個,字符。
請參閱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
uj5u.com熱心網友回復:
我想我只會有一個簡單的狀態機風格解釋..
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 來處理嵌套,并且只有 DESC 為 0
uj5u.com熱心網友回復:
我懷疑這是否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();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411035.html
標籤:
