首页 > 解决方案 > 用于搜索名字和姓氏的第一个字母的正则表达式模式

问题描述

我对正则表达式模式有疑问。每天我都会得到名字和姓氏。例子:

    Darkholme Van Tadashi
    Herrington Billy Aniki
    Johny
    Walker Sam Cooler
    etc..

事实是它们是特定的,并且不只包含一个姓氏和名字。

从这个列表中,我需要选择一个人(我知道他的姓和名)。为此,我找到了模式:

"Darkholme|\b[vt]"

正如我所说,我提前知道了这个人的数据(在列表到达之前)。但我只知道他的姓氏。我不知道第二个和第三个名字(Van Tadashi),我只知道这些名字的第一个字母(“V”和“T”)。我遇到了这个问题:当正则表达式分析传入数据时(我使用 regex.ismatch),如果输入字符串是“Van Dungeonmaster”,它会返回 true。如何创建一个仅在 surname=Darkholme、第二个和第三个名字的第一个字母匹配(=V 和 T)时才返回 true 的模式?

也许我没有说清楚.. 但最后,结果应该是我只将姓氏和名字的首字母以及父名传递给模式,并且正则表达式匹配输入字符串。

标签: c#regex

解决方案


如果存在逗号并且名称可以以 V 或 T 开头,其中第三个名称可以是可选的,则可以使用与除逗号之外的任何非空白字符匹配的可选组。

\bDarkholme\s+[VT][^\s,]+(?:\s+[VT][^\s,]+)?
  • \b单词边界,以防止 Darkholme 成为更大单词的一部分
  • Darkholme从字面上匹配
  • \s+[VT]匹配 1+ 个空格字符,后跟 V 或 T
  • [^\s,]+匹配除空格字符或逗号以外的任何字符的 1 次以上
  • (?:非捕获组
    • \s+[VT]匹配 1+ 个空格字符,后跟 V 或 T
    • [^\s,]+匹配除空格字符或逗号以外的任何字符的 1 次以上
  • )?关闭组以使第三部分成为可选

.NET 正则表达式演示

如果您知道名称以 V 开头表示第二个,而 T 表示第三个:

\bDarkholme\s+V[^\s,]+(?:\s+T[^\s,]+)?

.NET 正则表达式演示

如果名称也可以是单个 V 或 T,则量词可以是星号[^\s,]*


推荐阅读