常用表达。搜索没有重复数字的单词

Regular expressions. Search for words without repeating numbers

我需要编写代码来输出不重复数字的单词。通过分配,我必须使用 char 数组。我决定用正则表达式来做到这一点。目前我有这个表达:

regex rx ("^(?!.*(.).*)[0-9]+$");

如果你把字符串的每个单词分开,那么正则表达式就可以工作,但是如果你把字符串中的所有单词都写成用 space 分隔,那么正则表达式就不起作用了。我该如何解决这个问题?

输入文件:1234567890 987 787

代码必须至少输出1234567890,因为这是第一次匹配,它不会输出任何东西

完整代码:

int main() {

    regex rx ("^(?!.*(.).*)[0-9]+$");
    ifstream fin;
    fin.open("input.txt");
    int counter = 0;
    char ch;
    while (ch = fin.get() != EOF)
    {
        counter++;
    }
    cout << counter << "\n";
    fin.close();
    fin.open("input.txt");
    char *str = new char [counter];
    fin.getline(str, counter, '[=11=]');
    fin.close();
    cmatch res;

    std::regex_search(str, res, rx);
        std::cout << res[0] << std::endl;


    return 0;
}    

您可以使用

\b(?!\d*(\d)\d*)\d+\b

regex demo详情:

  • \b - 单词边界
  • (?!\d*(\d)\d*) - 号码中不允许有重复数字
  • \d+ - 一位或多位数字
  • \b - 单词边界

参见 online C++ demo:

#include <string>
#include <iostream>
#include <regex>
using namespace std;

int main() {
    std::regex r(R"(\b(?!\d*(\d)\d*)\d+\b)");
    char *str = "1234567890 987 787";

    for (cregex_iterator it(str, str + strlen(str), r); it != cregex_iterator{}; it++)
    {
        cout << (*it).str() << endl;
    }
    return 0;
}

输出将是 1234567890987