gpt4 book ai didi

c# - 查找具有额外资格条件的所有匹配项

转载 作者:行者123 更新时间:2023-11-30 15:56:16 25 4
gpt4 key购买 nike

给定的句子如;

Boy has a dog and a cat.
Boy microwaves a gerbil.
Sally owns a cat.

对于每个句子,我想要一个动物列表(定义为“狗”、“猫”或“沙鼠”),其中“男孩”是第一个词。对于上面的列表将是;

['dog', 'cat']
['gerbil']
3rd sentence would not match.

正则表达式;

dog|cat|gerbil

将返回所有匹配项,但不特定于男孩(第三句将返回不受欢迎的“猫”)。

^Boy.*(dog|cat|gerbil)

Returns整个短语直到最后一个匹配的动物,例如“男孩有一只狗和一只猫”,而第一个也是唯一一个组是“猫”。

如何获取与“男孩”相关的所有动物(即以“男孩”开头的句子中的动物)的列表?

最佳答案

你可以使用积极的回顾:

(?<=^Boy.*?)(?:dog|cat|gerbil)

或者,使用词边界的变体来匹配整个词中的动物:

(?<=^Boy\b.*?)\b(?:dog|cat|gerbil)\b

参见 regex demo

(?<=^Boy.*?)正面回顾需要 Boy在要匹配的消费模式的字符串的开头。

如果您的输入包含 LF(换行符)字符,请传递 RegexOptions.Singleline . 的选项也匹配换行符。

C# 用法:

var results = Regex.Matches(s, @"(?<=^Boy\b.*?)\b(?:dog|cat|gerbil)\b")
.Cast<Match>()
.Select(m => m.Value)
.ToList();

C# demo :

var strs = new List<string>() { "Boy has a dog and a cat.", 
"Boy something a gerbil.",
"Sally owns a cat." };
foreach (var s in strs)
{
var results = Regex.Matches(s, @"(?<=^Boy\b.*?)\b(?:dog|cat|gerbil)\b")
.Cast<Match>()
.Select(m => m.Value)
.ToList();
if (results.Count > 0) {
Console.WriteLine("{0}:\n[{1}]\n------", s, string.Join(", ", results));
}
else
{
Console.WriteLine("{0}:\nNO MATCH!\n------", s);
}
}

输出:

Boy has a dog and a cat.:
[dog, cat]
------
Boy something a gerbil.:
[gerbil]
------
Sally owns a cat.:
NO MATCH!
------

还有一个选择:匹配任何以Boy开头的字符串然后仅在每次成功匹配之后:

(?:\G(?!\A)|^Boy\b).*?\b(dog|cat|gerbil)\b

参见 this regex demo (或 regex101 link here )

您只需要获取第 1 组内容:

var results = Regex.Matches(s, @"(?:\G(?!\A)|^Boy\b).*?\b(dog|cat|gerbil)\b")
.Cast<Match>()
.Select(m => m.Groups[1].Value)
.ToList();

参见 this C# demo .

这里,

  • (?:\G(?!\A)|^Boy\b) - 先前匹配的结尾 ( \G(?!\A) ) 或字符串的开头后跟整个单词 Boy
  • .*? - 除换行符外的任何 0+ 个字符(如果没有将 RegexOptions.Singleline 传递给 Regex 构造函数)尽可能少
  • \b(dog|cat|gerbil)\b - 一个完整的词dog , catgerbil

基本上,这些正则表达式是相似的,尽管 \G基于正则表达式的结果可能会更快一些。

关于c# - 查找具有额外资格条件的所有匹配项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47144988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com