C#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
对于像#34;新病人,有限的" 输出应该是:"新" "限制"
对于像"沉积,1小时"等字符串;在哪里"小时"存在, 输出应该是:"沉积,1小时"
对于"患者"之后没有单词的字符串;但是"患者"存在,就像 "新饮食患者", 输出应该是:"新" "饮食"
对于既不是"患者"也不是"小时"如果存在,则应返回整个字符串。就像"学校体育"应该返回整个字符串, "学校体育"。
正如我所说,这是我的终极追求。目前,我正在努力专注于只分离出第一个模式:)。非常感谢。
答案 0 :(得分:2)
我建议使用
^(?:(?!\b(?:New|Established)\b).)*$|\b(New|Established)\s+(?:patient\b\W*)?(.+)
请参阅regex demo
<强>详情
^(?:(?!\b(?:New|Established)\b).)*$
- 任何字符串1}}或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.Value
和match.Groups[1].Value
。
结果: