C# 如何使用正则表达式找到模式的第n次出现?
我有一个由非数字字符分隔的数字字符串,如:“16-15316-273” 是否可以以返回第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是需要提取的模式顺序,输入字符
${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}
表示要匹配此项:
:匹配1个或多个十进制数字,后跟(\d+)
:精确匹配原子零宽度断言“输入字符串的结尾”${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:(?