gpt4 book ai didi

c# - 有没有办法回头看并忽略正则表达式中的特定字母?

转载 作者:太空宇宙 更新时间:2023-11-03 11:58:01 27 4
gpt4 key购买 nike

我需要一些正则表达式方面的帮助,(长话短说,我正在为“Papiamento”语言创建一个语法检查器,这是一种在 ABC 群岛(加勒比海)使用的语言,有些单词可以缩写,我不确定如何回头看并忽略一个字母)

我有“来”(吃)这个词,“吃”是“comiendo”。看看如何在“m”和“e”之间添加“i”?我试图让我的正则表达式仍然能够识别带有和不带有后缀“iendo”的“come”这个词,一个简单的解决方法是添加一个非捕获组(不一定,我只是使用非 -为我不需要它捕获的东西捕获组。)并分别检查两者 /com(?:iendo|e)?/ ,但我要处理超过 16,000 个单词,单独为每个单词添加正则表达式效率不高。

我的问题是:有没有办法向后看并忽略字母“e”?

/(come((?<=e)iendo))/但也忽略 'e',此正则表达式仅检查“come”和“comeiendo”(这是不正确的)


为了更清楚一点,我有一个 string[]用所有的话,让我们以这个数组为例 { "come", "bisti", "pasa" } ,它们都是不定式形式的动词。我希望正则表达式能够以其不定式形式和正在执行操作的形式(动名词)检测到它。“come”是动词的不定式,“comiendo”是动名词。

在我的正则表达式中我有它

string[] words = { "come", "bisti", "pasa" };
string pattern = $@"/({string.Join("|", words)})/";

// which is same as:
string pattern = @"/(come|bisti|pasa)/";

但它只是检查不定式形式,动名词大多数时候以“ando”或“iendo”结尾,具体取决于动词的最后一个字母。但在这种情况下,我只想关注“come”和“comiendo”,因为它是唯一一个将最后一个字母(即“e”)替换为“iendo”的字母,(其他动词只是将“ndo”附加到结束)。

所以我唯一能想到的正则表达式就是如果动词以'e'结尾然后忽略'e',然后检查动词(没有'e')(“com”),加上后缀(“iendo”)。

"come"=> "com"+ "iendo"

这是我能得到的最远的地方

string[] words = { "come", "bisti", "pasa" };
string pattern = $@"/((?:{string.Join("|", words)})(?:(?<=e)iendo|(?<=a)ndo)?)/";

// which is same as
string pattern = @"/((?:come|bisti|pasa)(?:(?<=e)iendo|(?<=a)ndo)?)/";

但是那个正则表达式只适用于“comiendo”而不适用于“comiendo”

enter image description here

最佳答案

您应该有一个包含所有不定式动词的数据库(索引列)。如果语言没有异常(理解:你总是只去掉最后一个字母得到词根),那么无限形式就足够了。否则在数据库中您将需要另一列来定义单词的词根。备选方案:使用根表单作为 key 。如果有语言异常(exception),请在新列中添加所有有用的共轭形式。

通过使用检测不定式和其他共轭形式的简单正则表达式,您可以检查每个匹配项是否真的是动词而不是误报。

“Comiendo”将是误报,因为数据库中没有任何动词具有此键。

/(\w*ndo\b|\w*a\b|\w*i\b|\w*e\b)/gm

Matching example考虑到要知道的单词量,在正则表达式中使用所有单词确实不是一个好的选择,而是使用数据库进行第二次验证,我认为这样做是为了:一个简单的select 在处理大量数据时会很快。

        var wordsFinder = new Regex(@"(\w*ndo\b|\w*a\b|\w*i\b|\w*e\b)", RegexOptions.Multiline | RegexOptions.IgnoreCase);

foreach (Match match in wordsFinder.Matches(inputText))
{
var word = match.Value.ToLower();
string infinitiveForm = null;
if (word.EndsWith("iendo"))
infinitiveForm = $"{word.Substring(0, word.Length - "iendo".Length)}e"; // not tested, please adapt :)
else if (word.EndsWith("ando"))
infinitiveForm = $"{word.Substring(0, word.Length - "ando".Length)}a";
else
infinitiveForm = word;

// now check for infinitiveForm in the database
}

关于c# - 有没有办法回头看并忽略正则表达式中的特定字母?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58683926/

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