我正在研究一个程序来检查给定字符串中是否存在特定字符串:即一个字符串是另一个字符串的子字符串。
例如:
1)字符串:YoungPeople - > 要检查的子字符串:ungPeo
The output should return true.
2)字符串:你好,你好吗? - > 要检查的子字符串:l *是
The output should return true.
我使用了基于朴素的搜索算法,它对第一次输入完全正常。
但我在第二种输入中遇到麻烦,其中存在星号(*),应将其视为正则表达式:即匹配零个或多个字符。
我应该如何检查带有*符号的子字符串?
我应该尝试使用相同的天真算法来搜索*之前的字符以及之后的字符串吗?或者有更好的方法来解决这个问题吗?
答案 0 :(得分:3)
我应该如何检查带有*符号的子字符串?
在阅读*
后,您需要在下面尝试1-2。
...使用相同的天真算法进行搜索...是否有更好的方法......?*
有更好的方法。接下来是一个递归。
[编辑说明:6/10发现/修复了错误]
当您浏览字符串时,请使用递归来检查字符串的其余部分
*
simple允许2个候选路径:
1)提前str
2)推进substr
否则匹配char
可以推进两者。
// StarCompare() helper function
bool StarCmp(const char *str, const char *pat) {
if (*pat == '\0') return 1;
if (*pat == '*') {
if (*str) {
// advance str and use the * again
if (StarCmp(str + 1, pat)) return 1;
}
// let * match nothing and advacne to the next pattern
return StarCmp(str, pat + 1);
}
if (*pat == *str) {
return StarCmp(str + 1, pat + 1);
}
return 0;
}
bool StarCompare(const char *str, const char *pat) {
if (!str || !pat) return 0;
do {
if (StarCmp(str, pat)) return 1;
} while (*str++);
return 0;
}
[编辑先前版本中的测试代码]
答案 1 :(得分:2)
GNU Regex Library似乎就像你要找的那样。如果您不熟悉正则表达式,请选中this site。
答案 2 :(得分:1)
以下是您需要做的事情:
或者,您可以像其他人建议的那样使用正则表达式。
答案 3 :(得分:0)
寻找一个精心编写的glob匹配实现的好地方是bash源。但是这里有一个简单的递归实现:
#include <assert.h>
int
_glob_match(char * pattern, char * str)
{
if (!*pattern) return 1;
if (!*str) return 0;
if (*pattern == '*') return match_any_tail(pattern + 1, str);
if (*pattern != *str) return 0;
else return _glob_match(pattern + 1, str + 1);
}
int
match_any_tail(char * pattern, char * str)
{
for (; *str; str++)
if (_glob_match(pattern, str))
return 1;
return 0;
}
int glob_match(char * pattern, char * str)
{
return match_any_tail (pattern, str);
}
void
main()
{
assert(glob_match("ungPeo", "YoungPeople"));
assert(glob_match("l*are", "Hello How are You?"));
}