【问题标题】:Regex searching for a letter starting a word and next word containing another word正则表达式搜索以单词开头的字母和包含另一个单词的下一个单词
【发布时间】:2017-04-26 23:02:30
【问题描述】:

如何搜索姓名列表并仅返回单词以“s”开头且下一个单词以“mary”开头的姓名?

例如,我有 2 个头衔:“Avera St. Mary's Hospital”和“Arthritis Care Specialists of Maryland”。我搜索“S Mary”并希望它返回“Avera St. Mary's Hospital”而不是“Arthritis Care Specialists of Maryland”。我的代码同时返回...任何帮助将不胜感激!

var testList = new List<string>();
List<string> titles = new List<string>();
titles.Add("Avera St. Mary's Hospital");
titles.Add("Arthritis Care Specialists of Maryland");
foreach (var title in titles)
{
    var pattern = @"(?<!\w)s.*\smary";
    Regex r = new Regex(pattern, RegexOptions.IgnoreCase);
    Match m = r.Match(title);
    if (m.Success)
    {
        testList.Add(title);
    }
}

【问题讨论】:

    标签: c# asp.net regex


    【解决方案1】:

    .* 是问题中给出的正则表达式中的问题。 .* 匹配太多文本。 (将其更改为非贪婪的.*? 将不起作用。)

    从 cmets 中的问题和附加示例来看,匹配应为:

    • s 开头的单词。 “单词”的定义并不精确,但使用“任何不是空格的字符”与示例匹配。
    • 两个单词之间的分隔符。假设允许一个或多个空格。
    • 以字母mary 开头的单词。这四个字符后面可以有任何内容。

    这导致了简单的正则表达式:\bs[^ ]* +mary

    \b               A word boundary
    s                This exact character
    [^ ]*            Zero or more characters that are not spaces
     +               One or more spaces
    mary             These exact characters
    

    对问题中的示例和 cmets 进行组合和排序,将这些示例作为应该匹配的示例:

    Avera St. Mary's Hospital
    Carondelet St. Mary's Hospital.
    Centre Hospitalier St- Mary,
    saint mary,
    Saint Mary's Home of Erie,
    st mary
    st mary's
    st. mary,
    

    这些是不应匹配的示例:

    Arthritis Care Specialists of Maryland
    Cardiovascular Specialists Of Central Maryland,
    

    【讨论】:

    • 可以跳过一个字吗?例如,如果我有一个名为“Albuquerque Associated Podiatrists”的条目并且我搜索了“alb podia”,那么它将返回该条目。现在,如果我搜索“alb associa”,正则表达式模式只会返回“Albuquerque Associated Podiatrists”(在空格必须是下一个词之后。如果它是名称中的一个词但不一定是下一个)。对于这个例子,我只是替换了正则表达式模式中的 's' 和 'mary' 精确字符。
    • 您现在是否要匹配原始问题中排除的 Specialists of Maryland 等字符串?
    【解决方案2】:

    mary 之后放置一个\b — 表示单词边界

    demo

    【讨论】:

      【解决方案3】:

      您需要更改正则表达式,例如:

      var pattern = @"(?&lt;!\w)s\w+[-||~|@|(|)|.]*[\s]+Mary";`

      [-|`|~|@|(|)|.] 指定 S* 和 Mary 之间允许的特殊字符,例如 St- Mary

      【讨论】:

      • 在我看来它会返回这两个值。我认为@Seth Pacheco 应该在mary 之后将表达式改为word boundaryword end。我不知道它在C#中的具体转义序列,但他可以搜索。
      • 我不确定其他情况,但我在控制台应用程序中测试了这两个输入,在输出中只得到了一个。
      • OP 需要澄清接受/拒绝进入列表的标准是什么。
      • 这个答案确实适用于这个例子。搜索的标准是返回包含“st mary”、“st. mary”、“saint mary”或可能是 mary 的复数形式(“mary's”)的任何内容。因此,如果列表中还有几个字符串,“马里兰中部心血管专家”、“圣玛丽中心医院”、“伊利圣玛丽之家”和“卡伦德莱特圣玛丽医院”。我希望搜索到最后三个而不是第一个(“马里兰中部心血管专家”)。提前致谢!
      猜你喜欢
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多