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