在另一个字符串中查找一串数字

时间:2014-01-07 19:54:25

标签: c++ string substring

所以,我在C ++中遇到了问题。

我需要搜索一个五个数字的字符串,这些数字并不总是在字符串中的相同位置。

例如,有时源字符串可能是“sjdjfut93835sxx”,有时可能是“jj3333333335”。

在第一个字符串中,我需要exctract“93835”。在第二个字符串中,我不会提取任何内容,因为数字字符串超过五个字符。

我需要找到5个字符长的数字字符串,只有数字,中间没有字母。

最简单的方法是什么?我在这方面遇到了很多麻烦,无法在谷歌的任何地方或过去的StackOverflow问题上找到答案

谢谢!

5 个答案:

答案 0 :(得分:2)

尝试将任务分为两个步骤。

首先,使用正则表达式之类的东西来拉出所有数字字符串(例子中的93835和3333333335)。

其次,删除任何长度不超过5个字符的结果。

答案 1 :(得分:1)

std::regex

int extract(const string& str) {
  smatch result;
  regex r("\\d{5}");
  regex_search(str, result, r);
  return stoi(result.str());
}

如果找不到数字,此函数(stoi)会抛出异常。

Edit ::此函数也匹配包含超过5个连续数字的字符串 你可以将正则表达式修改为(^|\\D)\\d{5}($|\\D),然后在调用stoi之前删除第一个非数字(如果有的话)。

答案 2 :(得分:0)

使用DFA(确定性有限自动机)算法和模式匹配算法非常简单。例如Boyer-Moore算法或Knuth-Morris-Pratt算法。您可以在任何算法手册中找到对它们的详尽描述。

否则,Joshua注意到你可能会使用一些现成的正则表达式库并完成搜索和模式匹配工作。

您的具体问题也可以通过手工制作的解决方案(如果我理解正确的话)“手动”解决,如下所示:

  • 一次扫描一个字符
  • 如果您遇到一个号码,请开始计算下一个号码
  • 如果> 5,然后放下它并重置计数器,直到找到另一个数字

非常简单, O(N)

答案 3 :(得分:0)

您可以使用以下状态创建简单的有限状态机:

1) Waiting for digit
2) Have first digit, waiting for second digit
3) Have second digit, waiting for third digit
4) ...
5) ...
6) ...
7) Have fifth digit, waiting for letter or end of string
8) Finish. Return string.

答案 4 :(得分:-1)

string text="sjdjfut93835sxx";

int digitCount=0;
string aux="";
for(int i=0; i<strlen(text); i++)
{

if(text[i]>=48 && text[i]<=57) // if is a digit
{
digitCount++;
aux+=text[i];
if(digitCount==5)
{
cout<<"I found it! "<<aux;
}

}
else
{
aux="";
digitCount=0;
}
}