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

标签 c# regex

我需要一些正则表达式方面的帮助, (长话短说,我正在为“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/

相关文章:

c# - 以 v4.0 为目标时对 v4.5 类的引用不明确

java - 使用 String.matches 将 PHP preg_match 逻辑移植到 Java 时不兼容

针对 REGEXP 的 Mysql 优化

c# - 事件处理程序抛出对象引用错误

c# - 我能否以编程方式更改全局 MSMQ 设置?

python - 如何在 Python 中查找非字母数字字符并将其移动到字符串的末尾

php - 正则表达式提取第二个破折号/连字符之前的所有字符

javascript - 正则表达式仅允许数字且最多 2 位数字

c# - 如何解决消息过滤器指示应用程序正忙。 (来自 HRESULT : 0x8001010A (RPC_E_SERVERCALL_RETRYLATER)) 的异常

c# - DLL 的入口点