正则表达式技术问题:无法提取目标字符串的第二捕获组
问题分析与解决方案
你的问题出在贪婪匹配上!在Singleline模式下,.会匹配包括换行在内的所有字符,而正则里的.*是贪婪的——它会尽可能多地匹配内容,导致Phone.*\n这部分直接吃掉了从Phone开始到最后一个换行符的所有内容(也就是(123) 456-7890\nLine2\nLine3\n),后面的(.*)City自然就没有剩余内容可以捕获了,所以第二组返回null。
修正后的正则表达式
把Phone.*\n中的贪婪.*改成非贪婪的.*?,让它只匹配到第一个换行符为止,这样就能给后面的捕获组留出Line2\nLine3的内容:
Regex rg = new Regex(@"Address(.*)Phone.*?\n(.*)City", RegexOptions.Singleline);
为什么这样有效?
Address(.*)Phone:依然捕获Address和Phone之间的123 Abc st.(如果想去掉末尾多余空格,可以调整为Address\s*(.*?)\s*Phone,完全适配你的预期结果)。Phone.*?\n:非贪婪匹配Phone后面的内容直到第一个换行符,也就是(123) 456-7890\n,不会吃掉后面的Line2和Line3。(.*)City:在Singleline模式下,.*会匹配从第一个换行符之后到City之前的所有内容,正好是Line2\nLine3,完美符合你的需求。
测试验证
用你的输入字符串测试修正后的正则,捕获组1会得到123 Abc st. ,捕获组2会准确返回Line2\nLine3。
内容的提问来源于stack exchange,提问作者KARAN
相关产品推荐
相关产品推荐

