常用表达。搜索没有重复数字的单词
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;
}
输出将是 1234567890
和 987
。
我需要编写代码来输出不重复数字的单词。通过分配,我必须使用 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;
}
输出将是 1234567890
和 987
。