Contents

ARST打卡第89周[89/521]

Algorithm

LeetCode/947_移除最多的同行或同列石头

Review

TED演讲:生命只有一次,请活得灿烂

如果苦难必将发生,那么我们唯一能做的是改变自己面对苦难的态度

Tips

断言(assert)的用法

Share - 正则匹配函数封装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
 * @brief 正则表达式匹配检查
 *
 * @param [in] reg_str 正则表达式
 * @param [in] check_str 待检测的字符串
 * @return int 匹配失败返回-1,匹配成功返回0
 *
 */
int reg_check(const char *reg_str, const char *check_str) {
    const char *pattern;
    int i, ret, cflags = 0;
    char ebuf[128];
    regex_t reg;
    regmatch_t pm[10];
    const size_t nmatch = 10;
    int flag = 0;
    /* 编译正则表达式*/
    pattern = reg_str;
    ret = regcomp(&reg, pattern, cflags);
    if (ret != 0) {
        regerror(ret, &reg, ebuf, sizeof(ebuf));
        fprintf(stderr, "%s: pattern '%s' \n", ebuf, pattern);
        return -1;
    }
    /* 处理输入的数据 */
    char *check_str_t = (char *)check_str;
    if ((ret = strlen(check_str_t)) > 0 && check_str_t[ret - 1] == '\n')
        check_str_t[ret - 1] = 0;
    /* 对每一行应用正则表达式进行匹配 */
    ret = regexec(&reg, check_str_t, nmatch, pm, 0);
    if (ret == REG_NOMATCH) {
        return -1;
    } else if (ret != 0) {
        regerror(ret, &reg, ebuf, sizeof(ebuf));
        fprintf(stderr, "%s: regcom('%s')\n", ebuf, check_str_t);
        return -1;
    }
    /* 输出处理结果 */
    for (i = 0; i < nmatch && pm[i].rm_so != -1; ++i) {
        int one_match_len = pm[i].rm_eo - pm[i].rm_so;
        int str_sz = strlen(check_str_t);
        if (one_match_len == str_sz) {
            flag = 1;
        }
        break;
    }
    /* 释放正则表达式 */
    regfree(&reg);
    return flag == 1 ? 0 : -1;
}

/**
 * @brief 对check_str做json key的参数校验
 *
 * @param [in] check_str 待检测的json key
 * @return int 匹配失败返回-1,匹配成功返回0
 */
int json_key_check(const char *check_str) {
    const char *json_str = "[a-zA-Z_][a-zA-Z_0-9-]*";
    return reg_check(json_str, check_str);
}