使用正则表达式动态分组字

时间:2018-03-20 05:22:20

标签: c# regex

有没有办法使用正则表达式动态分组单词?

我在c#

中有这段代码
string strRegex = @"(?<=\d+)(.*)(?=md\.?)";
Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @"2 Elizabeth                        Winslow                           md. Gilbert                             Brooks";

foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
    Debug.WriteLine(myMatch.Value);      
  }
}

这是我的示例文本

    2 Elizabeth                        Winslow                          md. Gilbert                             Brooks
8 Rebekah Gulliver Stall                                              md. George Leonard Dary

这是我的示例输出

Fname: Elizabeth : Index: 7
Lname: Winslow : Index: 40
Fname: Rebekah Gulliver : Index: 3
LName: Stall : Index: 20

在我的代码中,我只能获得number和单词md.之间的文字

如果我要分开单词。我无法获得单词的索引。

是否可以使用Regex动态分组这些单词?

或者另外一个解决方法是获取文本和索引吗?

1 个答案:

答案 0 :(得分:2)

您可以使用以下正则表达式解决方案:

var s = "    2 Elizabeth                        Winslow                          md. Gilbert                             Brooks";
var result = Regex.Matches(s, @"\d\s+(?<FName>.*?)\s+(?<LName>\S+)\s*md\b")
        .Cast<Match>()
        .Select(m => new {
            FName = m.Groups["FName"].Value, 
            FIndex = m.Groups["FName"].Index+1,
            LName = m.Groups["LName"].Value,
            LIndex = m.Groups["LName"].Index+1
        }).ToList();
foreach (var pair in result)
    Console.WriteLine($"{pair.FName} : {pair.FIndex} : {pair.LName} : {pair.LIndex}");
// => Elizabeth : 7 : Winslow : 40

请参阅C# demo

正则表达式是

\d\s+(?<FName>.*?)\s+(?<LName>\S+)\s*md\b

请参阅its online demo

<强>详情

  • \d - 数字
  • \s+ - 一个或多个空格
  • (?<FName>.*?) - Group&#34; FName&#34;:除了换行符之外的任何0 +字符,尽可能少
  • \s+ - 一个或多个空格
  • (?<LName>\S+) - Group&#34; LName&#34;:除了空格之外的任何0 +字符,尽可能多
  • \s* - 0个或更多空格
  • md\b - 整个单词md\b是单词边界)