C# 如何使用正则表达式找到模式的第n次出现?

C# 如何使用正则表达式找到模式的第n次出现?,c#,regex,C#,Regex,我有一个由非数字字符分隔的数字字符串,如:“16-15316-273” 是否可以以返回第n个匹配组的方式构建正则表达式?我听说${n}可能会有帮助,但至少在以下表达式中对我不起作用: // Example: I want to get 15316 var r = new Regex(@"(\d+)${1}"); var m = r.Match("16-15316-273"); (\d+${0}返回16,但是(\d+${1}给我273,而不是预期的15316 所以N是需要提取的模式顺序,输入字符

我有一个由非数字字符分隔的数字字符串,如:“16-15316-273” 是否可以以返回第n个匹配组的方式构建正则表达式?我听说
${n}
可能会有帮助,但至少在以下表达式中对我不起作用:

// Example: I want to get 15316
var r = new Regex(@"(\d+)${1}");
var m = r.Match("16-15316-273");
(\d+${0}
返回16,但是
(\d+${1}
给我273,而不是预期的15316

所以N是需要提取的模式顺序,输入字符串本身(“16-15316-273”只是一个例子)是动态值,在应用程序执行过程中可能会发生变化。这项任务是构建正则表达式,其中唯一改变的是N,并适用于任何此类字符串

请不要提供任何附加c#代码的解决方案,如
m.Groups[n]
Split
,我有意要求为此构建适当的正则表达式模式。简而言之,我不能为每个新的N值修改代码,我所能修改的只是动态构建的regex表达式,N将作为参数传递给方法。其余的都是静态的,无法更改。

试试这个:

string text = "16-15316-273";
Regex r = new Regex(@"\d+");
var m = r.Match(text, text.IndexOf('-'));
输出为15316;)

试试这个:

string text = "16-15316-273";
Regex r = new Regex(@"\d+");
var m = r.Match(text, text.IndexOf('-'));

输出为15316;)

也许这个表达对你有帮助

(?<=(\d+[^\d]+){1})\d+

也许这个表达对你有帮助

(?<=(\d+[^\d]+){1})\d+

你的正则表达式

(\d+)${1}
表示要匹配此项:

  • (\d+)
    :匹配1个或多个十进制数字,后跟
  • ${1}
    :精确匹配原子零宽度断言“输入字符串的结尾”
应该注意的是,
{1}
量词是多余的,因为通常只有输入字符串的一端(除非您启用了多行选项)

这就是为什么要匹配“273”:它是锚定在字符串末尾的最长数字序列

你需要使用一种新的方法。要捕获字符串中的第N个字段,需要捕获前面有N-1个字段的数字字符串。给定此源字符串:

string input = "1-22-333-4444-55555-666666-7777777-88888888-999999999" ;
匹配第三个字段(其中第一个字段是1而不是0)的正则表达式如下所示:

(?<=^(\d+(-|$)){2})\d+
它产生以下输出:

regex: (?<=^(\d+(-|$)){0})\d+ N= 1, N-1=0 , success: 1
regex: (?<=^(\d+(-|$)){1})\d+ N= 2, N-1=1 , success: 22
regex: (?<=^(\d+(-|$)){2})\d+ N= 3, N-1=2 , success: 333
regex: (?<=^(\d+(-|$)){3})\d+ N= 4, N-1=3 , success: 4444
regex: (?<=^(\d+(-|$)){4})\d+ N= 5, N-1=4 , success: 55555
regex: (?<=^(\d+(-|$)){5})\d+ N= 6, N-1=5 , success: 666666
regex: (?<=^(\d+(-|$)){6})\d+ N= 7, N-1=6 , success: 7777777
regex: (?<=^(\d+(-|$)){7})\d+ N= 8, N-1=7 , success: 88888888
regex: (?<=^(\d+(-|$)){8})\d+ N= 9, N-1=8 , success: 999999999
regex: (?<=^(\d+(-|$)){9})\d+ N=10, N-1=9 , failure

regex:(?您的正则表达式

(\d+)${1}
表示要匹配此项:

  • (\d+)
    :匹配1个或多个十进制数字,后跟
  • ${1}
    :精确匹配原子零宽度断言“输入字符串的结尾”
应该注意的是,
{1}
量词是多余的,因为通常只有输入字符串的一端(除非您启用了多行选项)

这就是为什么要匹配“273”:它是锚定在字符串末尾的最长数字序列

您需要使用。要捕获字符串中的第N个字段,您需要捕获前面有N-1个字段的数字字符串。给定此源字符串:

string input = "1-22-333-4444-55555-666666-7777777-88888888-999999999" ;
匹配第三个字段(其中第一个字段是1而不是0)的正则表达式如下所示:

(?<=^(\d+(-|$)){2})\d+
它产生以下输出:

regex: (?<=^(\d+(-|$)){0})\d+ N= 1, N-1=0 , success: 1
regex: (?<=^(\d+(-|$)){1})\d+ N= 2, N-1=1 , success: 22
regex: (?<=^(\d+(-|$)){2})\d+ N= 3, N-1=2 , success: 333
regex: (?<=^(\d+(-|$)){3})\d+ N= 4, N-1=3 , success: 4444
regex: (?<=^(\d+(-|$)){4})\d+ N= 5, N-1=4 , success: 55555
regex: (?<=^(\d+(-|$)){5})\d+ N= 6, N-1=5 , success: 666666
regex: (?<=^(\d+(-|$)){6})\d+ N= 7, N-1=6 , success: 7777777
regex: (?<=^(\d+(-|$)){7})\d+ N= 8, N-1=7 , success: 88888888
regex: (?<=^(\d+(-|$)){8})\d+ N= 9, N-1=8 , success: 999999999
regex: (?<=^(\d+(-|$)){9})\d+ N=10, N-1=9 , failure
regex:(?