C++ 在另一个正则表达式模式中使用已定义的正则表达式模式以及有关将正则表达式应用于文件的问题
如何在另一个正则表达式模式中使用已定义的正则表达式模式。例如,在以下代码中定义了符号和数字,我想在定义关系时使用它们:C++ 在另一个正则表达式模式中使用已定义的正则表达式模式以及有关将正则表达式应用于文件的问题,c++,regex,file,C++,Regex,File,如何在另一个正则表达式模式中使用已定义的正则表达式模式。例如,在以下代码中定义了符号和数字,我想在定义关系时使用它们: regex sign("=<|=|>|<=|<>|>="); regex number("^[1-9]\\d*"); regex relation(number, sign, number) 当我想打印文件中的匹配项时,它会打印包含任何匹配项的整行。我怎样才能让它只打印匹配项本身而不打印整行 更新:
regex sign("=<|=|>|<=|<>|>=");
regex number("^[1-9]\\d*");
regex relation(number, sign, number)
当我想打印文件中的匹配项时,它会打印包含任何匹配项的整行。我怎样才能让它只打印匹配项本身而不打印整行
更新:
#include <iostream>
#include <fstream>
#include <vector>
#include <regex>
using namespace std;
#define REGEX_SIGN "=<|=|>|<=|<>|>="
#define REGEX_DIGIT "[0-9]"
#define REGEX_NUMBER "^" REGEX_DIGIT "\\d*"
int main() {
regex sign(REGEX_SIGN);
regex digit(REGEX_DIGIT);
regex number(REGEX_NUMBER);
regex relation(REGEX_NUMBER REGEX_SIGN REGEX_NUMBER);
string line, text;
ifstream fin;
fin.open("name.txt");
if (fin.good()) {
while (getline(fin, line)) {
text += line + " ";
}
int count = 0;
string word = "";
for (int i = 0; i < text.length(); i++) {
if (text[i] == ' ') {
cout << "word = " << word << " | match: " << regex_match(word, relation) << endl;
if (regex_match(word, relation)) {
cout << word << endl;
}
word = "";
}
else {
word += text[i];
}
}
}
// cout << text << endl;
return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
#定义REGEX_符号“=|=”
#定义REGEX_数字“[0-9]”
#定义正则表达式数字“^”正则表达式数字“\\d*”
int main(){
正则表达式符号(正则表达式符号);
正则数字(正则数字);
正则表达式编号(正则表达式编号);
正则表达式关系(正则表达式编号正则表达式符号正则表达式编号);
字符串行、文本;
流鳍;
财务公开(“name.txt”);
如果(fin.good()){
while(getline(fin,line)){
文本+=行+“”;
}
整数计数=0;
字串=”;
对于(int i=0;i
我能看到的唯一解决方法是将正则表达式的字符串定义为宏,并使用编译器的文本字符串串联功能创建更大的字符串:
#define REGEX_SIGN "=<|=|>|<=|<>|>="
#define REGEX_DIGIT "[0-9]"
#define REGEX_NUMBER "^" REGEX_DIGIT "\\d*"
regex sign(REGEX_SIGN);
regex digit(REGEX_DIGIT);
regex number(REGEX_NUMBER);
regex relation(REGEX_NUMBER REGEX_SIGN REGEX_NUMBER);
#定义正则表达式符号“=|=”
#定义REGEX_数字“[0-9]”
#定义正则表达式数字“^”正则表达式数字“\\d*”
正则表达式符号(正则表达式符号);
正则数字(正则数字);
正则表达式编号(正则表达式编号);
正则表达式关系(正则表达式编号正则表达式符号正则表达式编号);
这不会重用实际的regex
对象,只会从较小的正则表达式中创建较长的文本字符串。在较大的正则表达式中“重用”较小的正则表达式的问题实际上是不可能的
我能看到的唯一解决方法是将正则表达式的字符串定义为宏,并使用编译器的文本字符串串联功能创建更大的字符串:
#define REGEX_SIGN "=<|=|>|<=|<>|>="
#define REGEX_DIGIT "[0-9]"
#define REGEX_NUMBER "^" REGEX_DIGIT "\\d*"
regex sign(REGEX_SIGN);
regex digit(REGEX_DIGIT);
regex number(REGEX_NUMBER);
regex relation(REGEX_NUMBER REGEX_SIGN REGEX_NUMBER);
#定义正则表达式符号“=|=”
#定义REGEX_数字“[0-9]”
#定义正则表达式数字“^”正则表达式数字“\\d*”
正则表达式符号(正则表达式符号);
正则数字(正则数字);
正则表达式编号(正则表达式编号);
正则表达式关系(正则表达式编号正则表达式符号正则表达式编号);
这不会重用实际的regex
对象,只会从较小的字符串中创建较长的文字字符串。关于“反斜杠d有误”的问题,您必须记住字符串中的反斜杠有特殊含义。如果您需要在字符串中显式使用反斜杠,则需要使用反斜杠对其进行转义,或使用“raw”字符串文字。@Someprogrammerdude是的,谢谢,在添加了另一个反斜杠后,错误消失了。我将用此更正更新问题。最后一个字符串可能是。关于“反斜杠d错误的smth”,您必须记住字符串中的反斜杠表示特殊的含义。如果您需要字符串中的显式反斜杠,则需要使用反斜杠对其进行转义,或使用“raw”字符串文字。@Someprogrammerdude是的,谢谢,在添加了另一个反斜杠后,错误消失了。我将用此更正更新问题。最后一个字符串可能是。我用脚本更新了问题,但似乎仍然有问题。我附加了输出屏幕截图。在这里,第一行和第三行必须是bematch:1
…REGEX_符号
应为“(?:=|=)”
以允许有意义的连接。和“^”
不应该出现在REGEX_NUMBER
@Jarod42中类似的内容。:)至少解决方法背后的原则应该是明确的。我用你的脚本更新了问题,但似乎仍然有问题。我附上了输出屏幕截图。在那里,第一行和第三行必须是匹配:1
…REGEX_符号
应该是“(?:=|=)”
以允许有意义的连接。并且“^”
不应该在REGEX_NUMBER
@Jarod42中类似的地方。:)至少解决方法背后的原理应该是清楚的。