.net Regex-括号之间的匹配引号

.net Regex-括号之间的匹配引号,.net,regex,.net,Regex,示例字符串: 冠状病毒('年龄',['5','7','9'])) 我有一个与引号内的值匹配的正则表达式: (["'])(?:(?=(\\?))\2.)*?\1 我试图使用lookahead/lookahead修改它,使其仅返回示例字符串中方括号内的引号: (?<=\[)(["'])(?:(?=(\\?))\2.)*?\1(?=\]) (?如果支持,一个选项是使用\G锚和捕获组: (?:\[|\G(?!^))('[^']+'),?(?=[^\]]*\]) 部分地 (?:非捕获组 \[

示例字符串:

冠状病毒('年龄',['5','7','9']))

我有一个与引号内的值匹配的正则表达式:

(["'])(?:(?=(\\?))\2.)*?\1
我试图使用lookahead/lookahead修改它,使其仅返回示例字符串中方括号内的引号:

(?<=\[)(["'])(?:(?=(\\?))\2.)*?\1(?=\])

(?如果支持,一个选项是使用
\G
锚和捕获组:

(?:\[|\G(?!^))('[^']+'),?(?=[^\]]*\])
部分地

  • (?:
    非捕获组
  • \[
    匹配开场白
    [
    • |
    • \G(?!^)
      在上一次匹配结束时断言位置
  • 关闭非捕获组
  • 捕获组1
    • '[^']+'
      匹配
      '
      ,1+倍除
      '
      以外的任何字符,然后再次匹配
      '
  • 关闭第1组
  • ,?
    匹配可选的
  • (?=[^\]]*\])
    正向前瞻,断言结束
    ]
|

比如说

string pattern = @"(?:\[|\G(?!^))('[^']+'),?(?=[^\]]*\])";
string input = @"cov('Age', ['5','7','9'])";

var results = Regex.Matches(input, pattern)
.Cast<Match>()
.Select(m => m.Groups[1].Value)
.ToArray();

foreach(string result in results)
{
    Console.WriteLine(result);
}

您尚未指定语言或正则表达式引擎,因此回答您的问题很困难。第四种答案适用于特定的正则表达式引擎(如PCRE),但不适用于其他引擎。在.NET中也存在另一种选择

因为此正则表达式引擎将所有捕获收集到一个


\[('[^']*'[,\]])+(?您似乎不需要任何复杂的正则表达式:在两个方括号之间获取一个字符串,并用单引号或逗号拆分捕获的内容,或者直接匹配您需要的内容

给定

这些方法可以是:

// Split captured text with ' and , 
var results = Regex.Matches(text, @"\[([^][]+)]")
        .Cast<Match>()
        .Select(x => x.Groups[1].Value.Split('\'', ',').Where(c => !string.IsNullOrEmpty(c)));
这里,这个


  • (?哪种语言或正则表达式引擎可能重复?在PCRE中,第四只鸟的答案是好的,在其他正则表达式中可能不起作用。编辑:语言是.NET。你在做什么?删除所有
    '
    内部
    […]
    ?是C#吗?你有权限访问代码吗?可能会简单得多。你有
    cov('Age',['5','7','9'))
    ,确切的预期结果及其类型是什么?是的,它是我的code.C#。我从get请求中收到此字符串,必须将括号内的值动态转换为.Net数组。它工作得非常好,谢谢!!只有一个问题:有一种方法可以使用反斜杠“\”来转义引号字符?假设我想写数组元素之一内的引号:[5',5\'',这样反斜杠就不会打断正则表达式。我的示例中的第一个正则表达式是这样做的:“(?=(\\?)”,因为我不知道如何将它应用到您的示例中。
    \[('[^']*'[,\]])+(?<=])
    
    var text = "cov('Age', ['5','7','9'])";
    
    // Split captured text with ' and , 
    var results = Regex.Matches(text, @"\[([^][]+)]")
            .Cast<Match>()
            .Select(x => x.Groups[1].Value.Split('\'', ',').Where(c => !string.IsNullOrEmpty(c)));
    
    var results1 = Regex.Matches(text, @"\[([^][]+)]")
            .Cast<Match>()
            .Select(x => Regex.Matches(x.Groups[1].Value, @"\d+"));
    
    var results = Regex.Matches(text, @"(?<=\[[^][]*)\d+(?=[^][]*])").Cast<Match>().Select(x => x.Value);