首页 > 解决方案 > 如何检查一个单词是否是介词(使用 C 中的正则表达式)

问题描述

我用 C 读了一段文字,我想用正则表达式检查当前单词是否是介词

我已经尝试过了,但它没有用

 int function(const char *testRegex){
     regex_t regex;

     if(regcomp(&regex, "^(a|an|the|in|on|of|and|is|are)$", 0)) {
            // handle error
     }
     int value;
     value = regexec(&regex, testRegex, 0, NULL, 0);
     return value;
  }

如果我通过函数任何单词它总是返回它不匹配即使我通过 (a, an, the...)

那么问题是什么?

标签: cregex

解决方案


"^(a|an|the|in|on|of|and|is|are)$"是一个扩展的正则表达式:你应该传递REG_EXTENDEDregcomp.

另请注意,regexec返回0匹配项和regex_t必须释放对象以避免内存泄漏。

#include <stdio.h>
#include <regex.h>

int isprep(const char *testRegex) {
    regex_t regex;
    int match;

    if (regcomp(&regex, "^(a|an|the|in|on|of|and|is|are)$", REG_EXTENDED)) {
        return -1;
    }
    match = !regexec(&regex, testRegex, 0, NULL, 0);
    regfree(&regex);
    return match;
}

int main() {
    printf("a -> %d\n", isprep("a"));
    printf("an -> %d\n", isprep("an"));
    printf("ann -> %d\n", isprep("ann"));
    return 0;
}

输出:

a -> 1
an -> 1
ann -> 0

基本正则表达式在指定子表达式\之前需要 a(并且不支持替换 ( foo|bar)。

在Open Group 文档中查看更多详细信息。


推荐阅读