我需要此字符串中的任意数量的版本:
magic-string: ["1.0.2.2 ", "1.2", "1.1"];
我有什么:
[s""\]+([d.]+)+[s""\]+
比赛:
1.0.2.2
1.2
1.1
到目前为止很好,但我想确保"魔术字符串"也可用,这不会匹配:
any-random-string: ["1.0.2.2 ", "1.2", "1.1"];
编辑: C# 中的工作解决方案:
public class Program
{
public static void Main()
{
string pattern = @"(?<=^s*magic-string:s*[(?:s*""(?:d+(?:.d+)*s*"",)?)+)d+(?:.d+)*";
var matches = Regex.Matches(" magic-string: [ "1.0", "1.2", "1.1" ];", pattern, RegexOptions.IgnoreCase);
Console.WriteLine(matches.Count);
foreach (Match match in matches)
{
Console.WriteLine(match.Groups.Count);
Console.WriteLine(match.Value);
Console.WriteLine(match.Groups[1].Value);
}
}
}
https://dotnetfiddle.net/Kc2J2A
在支持可变长度查找的语言(如 .NET 和 JavaScript EMCA2018+(中:
在此处查看正在使用的正则表达式
(?<=^magic-string:s*[(?:s*\"(?:d+(?:.d+)*s*\",)?)+)d+(?:.d+)*
工作原理:
(?<=^magic-string:s*[(?:s*\"(?:d+(?:.d+)*s*\",)?)+)
积极的回溯,确保前面的内容与以下内容相匹配^magic-string:s*[
匹配以下内容^
行首断言位置magic-string:
从字面上匹配这一点s*[
匹配任意数量的空格字符,后跟字面上的[
(?:s*\"(?:d+(?:.d+)*s*\",)?)+
匹配以下一次或多次s*\",
匹配任意数量的空格字符,后跟字面上的",
(?:d+(?:.d+)*s*\",)?
可以选择匹配以下内容d+
匹配任何数字一次或多次(?:.d+)*
匹配.
一个或多个数字,任意次数(匹配.1
,.1.1
等,其中1
是任意数字(s*\"
匹配任意数量的空格字符,后跟字面上的"
d+
匹配任何数字一次或多次(?:.d+)*
匹配.
一个或多个数字,任意次数(匹配.1
,.1.1
等,其中1
是任意数字(
简单来说,这匹配了前面有magic-string: ["0.0", "
的0
、0.0
、0.0.0
等的所有位置,子字符串0.0", "
出现零次或多次。(0.0
是(?:d+(?:.d+)*
匹配的所有格式的占位符(。
您可以在支持G
和K
令牌的语言(如 PCRE(中使用以下正则表达式:
在此处查看正在使用的正则表达式
(?:^magic-string:s*[|G(?!A)s*\",)s*\"Kd+(?:.d+)*
工作原理:
(?:^magic-string:s*[|G(?!A)s*\",)
匹配以下任一选项^magic-string:s*[
匹配以下内容^
行首断言位置magic-string:
从字面上匹配s*[
匹配任意数量的空格字符,后跟字面上的[
G(?!A)s*\",
匹配以下内容G(?!A)
在上一场比赛结束时断言位置s*\",
匹配任意数量的空格字符,后跟字面上的",
s*\"Kd+(?:.d+)*
s*\"
匹配任意数量的空格字符,后跟字面上的"
K
重置比赛的起点,任何以前消耗的角色都不再在最终匹配中d+
匹配任何数字一次或多次(?:.d+)*
匹配.
一个或多个数字,任意次数(匹配.1
,.1.1
等,其中1
是任意数字(
简单来说,这匹配前面有magic-string: ["
的所有位置或前一个匹配的位置,后跟", "
。