[英]Regex to match words separated by '!' and enclosed between curly brackets '{' '}'
[英]Regex - Match quotes between brackets
示例字符串:
cov('年龄', ['5','7','9'])
我有这个与引号内的值匹配的正则表达式:
(["'])(?:(?=(\\?))\2.)*?\1
我正在尝试将其修改为仅使用前瞻/后视从示例字符串返回方括号内的引号:
(?<=\[)(["'])(?:(?=(\\?))\2.)*?\1(?=\])
但它匹配方括号内的所有内容。
我怎样才能只匹配没有逗号的引号,就像第一个正则表达式一样,但在方括号内?
编辑。
语言是 .NET。
如果支持,一个选项是使用\G
锚和捕获组:
(?:\[|\G(?!^))('[^']+'),?(?=[^\]]*\])
在零件
(?:
非捕获组\[
比赛开场[
|
或者\G(?!^)
在上一场比赛结束时断言 position)
关闭非捕获组(
捕获组 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);
}
Output
'5'
'7'
'9'
您尚未指定语言或正则表达式引擎,因此很难回答您的问题。 第四只鸟的答案适用于特定的正则表达式引擎(例如 PCRE),但不适用于其他引擎。 .NET 中也存在另一种选择。
对于.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.