代码之家  ›  专栏  ›  技术社区  ›  Alan Wayne

正则表达式c按确切顺序从两个单词中匹配字符串并返回未匹配单词的捕获

  •  2
  • Alan Wayne  · 技术社区  · 7 年前

    C正则表达式

    我有以下字符串列表:

    • “新病人,简短”
    • 新病人,有限公司
    • 既成事实的病人,简短的
    • 固定病人,有限公司
    • “新饮食病人”
    • “固定饮食患者”
    • “学校体育”
    • 沉积,1小时
    • 沉积,2小时

    我想用regex将这些字符串分成几个组。

    我看到的第一个模式是: “新的”或“建立的”——将是匹配模式的第一个单词。这个词需要被捕获并返回。在这种模式下,“病人”必须在场而无需捕捉。“病人”之后的任何单词都必须被捕获。

    我试过了: ((?=.*\bNew\b))(?=.*\bpatient\b)([A-Za-z0-9\-]+) 但回报匹配给出:

    Full match  0-3 `New`
    Group 1.    0-0 ``
    Group 2.    0-3 `New`
    

    完全不是我要找的。

    string input = "New patient, limited";
    string pattern = @"((?=.*\bNew\b))(?=.*\bpatient\b)([A-Za-z0-9\-]+)";
    MatchCollection matches = Regex.Matches(input, pattern);
    GroupCollection groups = matches[0].Groups;
    
    
    foreach (Match match in matches)
    {
      Console.WriteLine("First word:        {0}", match.Groups[1].Value);
      Console.WriteLine("Last words: {0}", match.Groups[2].Value);
      Console.WriteLine();
    }
    Console.WriteLine();
    

    谢谢你的帮助。

    编辑第1页

    对于“新病人,有限”这样的字符串 输出应为:“new”“limited”

    对于“沉积,1小时”这样有“小时”的字符串, 输出应为:“沉积,1小时”

    对于“patient”后面没有单词但“patient”存在的字符串,例如 “新饮食病人”, 输出应该是:“new”“diet”

    对于既不存在“patient”也不存在“hour”的字符串,应返回整个字符串。也就是说“学校物理”应该返回整个字符串, “学校体育”。

    正如我所说,这是我的终极追求。目前,我正试图集中精力分离出第一种模式:)。非常感谢。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Wiktor Stribiżew    7 年前

    我建议使用

    ^(?:(?!\b(?:New|Established)\b).)*$|\b(New|Established)\s+(?:patient\b\W*)?(.+)
    

    regex demo

    细节

    • ^(?:(?!\b(?:New|Established)\b).)*$ -任何没有 New Established 整体而言
    • | -或
    • \b(New|Established) -一整句话 新的 既定的 (放入第一组)
    • \s+ -1+空格
    • (?:patient\b\W*)? -一个可选的非捕获组,与 patient 后跟单词边界和0+非单词字符
    • (.+) -第二组:除换行符外的任意一个或多个字符。

    代码看起来像

    var match = Regex.Match(s, @"^(?:(?!\b(?:New|Established)\b).)*$|\b(New|Established)\s+(?:patient\b\W*)?(.+)");
    

    如果组1不匹配( !match.Groups[1].Success ),抓住整个火柴, match.Value . 否则,抓住 match.Groups[1].Value match.Groups[2].Value .

    结果:

    enter image description here