.NET正则仅匹配最后匹配项:捕获组使用求助
解决正则捕获组仅匹配最后一位数字的问题
嘿,我刚学正则捕获组的时候也踩过一模一样的坑!你遇到的问题大概率是正则表达式只匹配了单个数字,而非连续的数字序列,导致每次捕获组只能拿到最后一个单独的数字字符。
问题根源
如果你用的正则是类似 (\d) 这样的写法,\d 只会匹配单个数字字符。当字符串里有连续数字(比如168)时,正则会依次匹配1、6、8,而捕获组最后存储的就是最后一次匹配的结果——也就是8。
修正方案
要匹配连续的数字串,你需要给\d加上量词+,也就是写成 (\d+)。+表示匹配前面的元素(这里是数字)一次或多次,这样就能把一整串连续数字作为一个整体捕获到组里。
结合你的C#代码示例
给你补全并修正TryMatch方法,看看效果:
using System; using System.Text.RegularExpressions; class Program { static void Main(string[] args) { string testTxt = "sadsadas168.asdsad"; string asdf = "wrongwrong"; string abc = "abc.png"; string bsdf = "100"; string lolol = "155abx.text"; string another = "sasd199.ong100"; TryMatch(testTxt); TryMatch(asdf); TryMatch(abc); TryMatch(bsdf); TryMatch(lolol); TryMatch(another); } static void TryMatch(string input) { // 修正后的正则:捕获所有连续数字串 Regex regex = new Regex(@"(\d+)"); MatchCollection matches = regex.Matches(input); Console.WriteLine($"输入字符串: {input}"); if (matches.Count == 0) { Console.WriteLine("未匹配到任何数字"); } else { Console.WriteLine("捕获到的数字串:"); foreach (Match match in matches) { // Group[1]就是我们定义的捕获组 Console.WriteLine($"- {match.Groups[1].Value}"); } } Console.WriteLine("---"); } }
运行结果示例
输入字符串: sadsadas168.asdsad 捕获到的数字串: - 168 --- 输入字符串: wrongwrong 未匹配到任何数字 --- 输入字符串: abc.png 未匹配到任何数字 --- 输入字符串: 100 捕获到的数字串: - 100 --- 输入字符串: 155abx.text 捕获到的数字串: - 155 --- 输入字符串: sasd199.ong100 捕获到的数字串: - 199 - 100 ---
额外小贴士
如果你只需要匹配字符串中的第一组连续数字,可以用regex.Match(input)代替Matches,然后判断Success属性即可:
Match match = regex.Match(input); if (match.Success) { Console.WriteLine($"捕获到的数字: {match.Groups[1].Value}"); }
内容的提问来源于stack exchange,提问作者T.Zak
相关产品推荐
相关产品推荐

