繁体   English   中英

正则表达式 - 匹配括号之间的引号

[英]Regex - Match quotes between brackets

示例字符串:

cov('年龄', ['5','7','9'])

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

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

我正在尝试将其修改为仅使用前瞻/后视从示例字符串返回方括号内的引号:

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

但它匹配方括号内的所有内容。

我怎样才能只匹配没有逗号的引号,就像第一个正则表达式一样,但在方括号内?

编辑。

语言是 .NET。

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

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

在零件

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

正则表达式演示| C# 演示

例如

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);
}

Output

'5'
'7'
'9'

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

对于您可以使用以下内容,因为此正则表达式引擎将所有捕获收集到CaptureCollection中:

请参阅此处使用的正则表达式

\[('[^']*'[,\]])+(?<=])

对于大多数其他语言(此答案或@Thefourthbird's未涵盖),您需要分两步执行此操作:

  • 获取所有匹配\[([^[\]]*)]的字符串(你想要第 1 组的值)
  • 匹配所有出现的'([^']*)' (您需要第 1 组的值作为内容)

您似乎不需要任何复杂的正则表达式:在两个方括号之间抓取一个字符串,并用单引号或逗号分隔捕获的内容,或者在此处明确匹配您需要的内容。

给定

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)));

或者,匹配括号之间的字符串,然后从中提取所有 1+ 数字块:

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);

在这里, 正则表达式匹配

  • (?<=\[[^][]*) - position 前面有[和除[]以外的任何数量的字符
  • \d+ - 1+ 位
  • (?=[^][]*]) - position 后跟除[]之外的任何 0+ 字符,然后是]

请参阅在线 C# 演示

提取任何数字变得有点复杂,将\d+替换为[-+]?\d*\.?\d+([eE][-+]?\d+)?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM