在 C# 中捕获常量字符串之后的重复模式



我需要此字符串中的任意数量的版本:

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", "00.00.0.0等的所有位置,子字符串0.0", "出现零次或多次。(0.0(?:d+(?:.d+)*匹配的所有格式的占位符(。


您可以在支持GK令牌的语言(如 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: ["的所有位置或前一个匹配的位置,后跟", "

相关内容

最新更新