检查另一个字符串中是否存在带星号(*)的字符串

时间:2013-06-09 11:55:11

标签: c algorithm search

我正在研究一个程序来检查给定字符串中是否存在特定字符串:即一个字符串是另一个字符串的子字符串。

例如:

  

1)字符串:YoungPeople - > 要检查的子字符串:ungPeo

  The output should return true.
     

2)字符串:你好,你好吗? - > 要检查的子字符串:l *是

    The output should return true.

我使用了基于朴素的搜索算法,它对第一次输入完全正常。

但我在第二种输入中遇到麻烦,其中存在星号(*),应将其视为正则表达式:即匹配零个或多个字符。

我应该如何检查带有*符号的子字符串?

我应该尝试使用相同的天真算法来搜索*之前的字符以及之后的字符串吗?或者有更好的方法来解决这个问题吗?

4 个答案:

答案 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)

以下是您需要做的事情:

  1. 按*字符
  2. 拆分搜索字符串
  3. 在您要搜索的字符串中查找每个部分(按照正确的顺序)
  4. 或者,您可以像其他人建议的那样使用正则表达式。

答案 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?"));
}