C# 正则表达式为字符串中的多个数字命名捕获

C# 正则表达式为字符串中的多个数字命名捕获,c#,regex,C#,Regex,给一串 var testData = "1234 test string 987 more test"; 我希望能够使用正则表达式提取1234和987。据我所知 var reg = new Regex(@"?<numbers>\d+"); 我认为 Assert.AreEqual(match.Groups["numbers"].Captures.Count(), 2); 但是只有1。我做错了什么?直觉告诉我 ?<group> ? 表示这些值中只能有0或1

给一串

 var testData = "1234 test string 987 more test";
我希望能够使用正则表达式提取1234和987。据我所知

 var reg = new Regex(@"?<numbers>\d+");
我认为

 Assert.AreEqual(match.Groups["numbers"].Captures.Count(), 2);
但是只有1。我做错了什么?直觉告诉我

 ?<group> 
表示这些值中只能有0或1个。我不应该使用命名组吗

 *<group> 
*

在visual studio中的正则表达式生成器中似乎不起作用,但我在测试中没有尝试过它。

为什么不按如下所示使用模式字符串:

Regex reg = new Regex(@"\d+");
然后通过以下方式获取数字:

MatchCollection matches = reg.Matches(testData);
之后,
matches
变量包含两个匹配值,分别表示1234和987

您还可以将断言用作:

Assert.AreEqual(matches.Count, 2);
希望它能帮助你

试试看{
try {
    Regex regexObj = new Regex(@"([\d]+)", RegexOptions.IgnoreCase);
    Match matchResults = regexObj.Match(subjectString);
    while (matchResults.Success) {
        for (int i = 1; i < matchResults.Groups.Count; i++) {
            Group groupObj = matchResults.Groups[i];
            if (groupObj.Success) {
                // matched text: groupObj.Value
                // match start: groupObj.Index
                // match length: groupObj.Length
            } 
        }
        matchResults = matchResults.NextMatch();
    } 
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}
Regex regexObj=new Regex(@“([\d]+)”,RegexOptions.IgnoreCase); Match matchResults=regexObj.Match(subjectString); while(matchResults.Success){ 对于(int i=1;i
我将尝试一下。我想我是在尝试使用我还没有使用过的正则表达式的更多功能。如何通过命名的捕获实现这一点?或者:
foreach(在正则表达式中匹配m.Matches(s,@“\d+”){/*匹配的文本:m.Value*/}
;)另一方面,要注意正则表达式符号的这种直觉,因为诸如
*
等符号的含义高度依赖于上下文。例如,
(?:[:\b-[-]])??(?\b)?
是一个有效的.NET正则表达式,其中每个
\b
-
都有不同的含义。
(?)
中的
(?)
中的
具有完全不同的含义,并且与
中的
没有任何关系。
try {
    Regex regexObj = new Regex(@"([\d]+)", RegexOptions.IgnoreCase);
    Match matchResults = regexObj.Match(subjectString);
    while (matchResults.Success) {
        for (int i = 1; i < matchResults.Groups.Count; i++) {
            Group groupObj = matchResults.Groups[i];
            if (groupObj.Success) {
                // matched text: groupObj.Value
                // match start: groupObj.Index
                // match length: groupObj.Length
            } 
        }
        matchResults = matchResults.NextMatch();
    } 
} catch (ArgumentException ex) {
    // Syntax error in the regular expression
}