如何使用正则表达式动态分组单词?附C#代码示例
正则表达式动态分组单词的实现方案
当然可以用正则表达式实现动态分组单词!先看看你当前代码的问题:你写的正则(?<=\d+)(.*)(?=md\.?)只会捕获数字到md/md.之间的所有内容,而且是一个整体组,没法把前后的名字拆分;另外.*是贪婪匹配,在复杂文本里可能会匹配到超出预期的内容。
针对你的示例文本(比如2 Elizabeth Winslow md. Gilbert Brooks、8 Rebekah Gulliver Stall md. George Leonard Dary),我们可以用命名捕获组来动态拆分md前后的名字部分,不管名字包含多少个单词都能正确捕获。
改进后的正则表达式
^\d+\s+(?<Spouse1>.*?)\s+md\.?\s+(?<Spouse2>.*)$
各部分解释:
^\d+:匹配开头的数字(比如示例里的2、8)\s+:匹配数字和名字之间的一个或多个空格(?<Spouse1>.*?):非贪婪模式的命名分组,捕获md/md.之前的所有名字内容(不管有多少个单词)\s+md\.?\s+:匹配md或md.,以及前后的空格(?<Spouse2>.*):命名分组,捕获md/md.之后的所有名字内容$:匹配字符串结尾,确保不会遗漏后面的内容
修改后的C#代码
using System; using System.Text.RegularExpressions; class Program { static void Main() { string strRegex = @"^\d+\s+(?<Spouse1>.*?)\s+md\.?\s+(?<Spouse2>.*)$"; Regex myRegex = new Regex(strRegex, RegexOptions.None); // 测试示例文本 string[] targetStrings = { @"2 Elizabeth Winslow md. Gilbert Brooks", @"8 Rebekah Gulliver Stall md. George Leonard Dary" }; foreach (string strTargetString in targetStrings) { Match myMatch = myRegex.Match(strTargetString); if (myMatch.Success) { Console.WriteLine($"原始文本: {strTargetString}"); Console.WriteLine($"配偶1: {myMatch.Groups["Spouse1"].Value}"); Console.WriteLine($"配偶2: {myMatch.Groups["Spouse2"].Value}"); Console.WriteLine("---"); } } } }
运行结果
原始文本: 2 Elizabeth Winslow md. Gilbert Brooks 配偶1: Elizabeth Winslow 配偶2: Gilbert Brooks --- 原始文本: 8 Rebekah Gulliver Stall md. George Leonard Dary 配偶1: Rebekah Gulliver Stall 配偶2: George Leonard Dary ---
注意事项
- 使用
.*?非贪婪匹配很关键,它会在遇到第一个md/md.时停止匹配,避免把后面的内容也包含进来 - 命名分组让代码可读性更强,你可以根据需求修改分组名称(比如改成
FirstName/SecondName) - 如果你的文本里
md前后的空格数量不固定,\s+可以匹配一个或多个空格,适配不同格式
内容的提问来源于stack exchange,提问作者mecocopy
相关产品推荐
相关产品推荐

