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);
}