我需要有关正则表达式的帮助,(长话短说,我正在为“ Papiamento”语言(在ABC群岛(加勒比海)中使用的一种语言)创建语法检查器,有些单词可以缩写,我不确定如何去往后看而忽略一封信)
我有“来”(吃)这个词,“吃”一词是“ comiendo”。看看如何在“ m”和“ e”之间添加“ i”?我试图使我的正则表达式仍然能够识别带有或不带有后缀“ iendo”的“ come”一词,一个简单的解决方法是添加一个非捕获组(不一定,我只是使用非捕获组,我不需要捕获它。)并单独检查两个/com(?:iendo|e)?/
单词,但是我处理的单词超过一万六千个,为每个单词单独添加一个正则表达式效率不高。
我的问题是:有没有办法回头看而忽略字母“ e”?
/(come((?<=e)iendo))/
但也忽略了'e',此正则表达式仅检查“ come”和“ comeiendo”(不正确)
为了更清楚一点,我使用了string[]
所有单词,例如{ "come", "bisti", "pasa" }
,让我们使用此数组,它们都是不定式形式的动词。我希望正则表达式能够以其不定形式和正在执行操作的形式(gerund)进行检测。“ 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”,因为它是唯一一个用“ iendo”替换最后一个字母(“ e”)的字母,(其他动词只是将“ 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)?)/";
但该正则表达式仅适用于“ comeiendo”,而不适用于“ comiendo”
您应该有一个包含所有不定式动词(索引列)的数据库。如果语言没有例外(请理解:您总是只删除最后一个字母以获取根),那么无穷大的形式就足够了。否则,在数据库中,您将需要另一列来定义单词的词根。替代方法:使用根形式作为密钥。如果有语言例外,请将所有有用的共轭形式添加到新列中。
通过使用检测不定式和其他共轭形式的简单正则表达式,您可以检查每个匹配项是否确实是动词而不是假阳性。
“ Comiendo”将是错误肯定的,因为数据库中没有动词具有该键。
/(\w*ndo\b|\w*a\b|\w*i\b|\w*e\b)/gm
考虑到要知道的单词数量,在正则表达式中使用所有单词并不是一个好选择,而是第二次使用数据库进行验证,我认为这样做是正确的:对于大量数据,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
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句