Regex C#按照确切的顺序匹配两个单词的字符串并返回非匹配单词

时间:2018-06-06 17:33:26

标签: c# regex

C#Regex

我有以下字符串列表:

  • "新病人,简介"
  • "新病人,有限"
  • "成立耐心,简短"
  • "成立患者,有限"
  • "新饮食患者"
  • "成立饮食患者"
  • " School Physical"
  • "沉积,1小时"
  • "沉积,2小时"

我想使用正则表达式将这些字符串分成几组。

我看到的第一个模式是: "新"或"成立" - 将是匹配模式的第一个单词。这个词需要被捕获并返回。在这种模式中,"患者"必须在场而不需要捕获。在"患者"之后的任何单词必须被捕获。

我试过了:((?=.*\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

对于像#34;新病人,有限的" 输出应该是:"新" "限制"

对于像"沉积,1小时"等字符串;在哪里"小时"存在, 输出应该是:"沉积,1小时"

对于"患者"之后没有单词的字符串;但是"患者"存在,就像 "新饮食患者", 输出应该是:"新" "饮食"

对于既不是"患者"也不是"小时"如果存在,则应返回整个字符串。就像"学校体育"应该返回整个字符串, "学校体育"。

正如我所说,这是我的终极追求。目前,我正在努力专注于只分离出第一个模式:)。非常感谢。

1 个答案:

答案 0 :(得分:2)

我建议使用

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

请参阅regex demo

<强>详情

  • ^(?:(?!\b(?:New|Established)\b).)*$ - 任何字符串New整个字词
  • Established - 或
  • | - 整个字\b(New|Established)New(放入第1组)
  • Established - 1+空格
  • \s+ - 一个可选的非捕获组,匹配1或0次出现(?:patient\b\W*)?,后跟单词边界和0 +非单词字符
  • patient - 第2组:除了换行符之外的任何1个或多个字符。

代码看起来像

(.+)

如果第1组未匹配(var match = Regex.Match(s, @"^(?:(?!\b(?:New|Established)\b).)*$|\b(New|Established)\s+(?:patient\b\W*)?(.+)"); ),请抓取整个匹配!match.Groups[1].Success。否则,请抓住match.Valuematch.Groups[1].Value

结果:

enter image description here