需要支持定义正确的正则表达式
need support defining the right regex
我想使用boost::sregex_token_iterator
解析一个文件。
不幸的是,我找不到正确的正则表达式来提取FOO:BAR
形式的字符串。
下面的代码示例仅在每行找到一个这样的出现时才可用,但我想支持每行多个此类条目,理想情况下也是"#"之后的注释
所以像这样的条目
AA:BB CC:DD EE:FF #this is a comment
应生成 3 个已识别的令牌(AA:BB、CC:DD、EE:FF(
boost::regex re("((\W+:\W+)\S*)+");
boost::sregex_token_iterator i(line.begin(), line.end(), re, -1), end;
for(; i != end; i++){
std::stringstream ss(*i);
...
}
非常欢迎任何支持。
我建议你使用拆分来获取你需要的值。
我将首先使用#
进行拆分。这会将注释与行的其余部分分开。然后使用空格拆分,将配对分开。在此之后,可以使用:
拆分单个对。
如果出于某种原因您必须使用正则表达式,则可以迭代匹配项。在这种情况下,我将使用以下正则表达式:
(?:#(?:.*))*(w+:w+)s*
此正则表达式将匹配每对,直到找到注释。如果有注释,它将跳到下一个新行。
您希望匹配 1 个或多个单词字符的序列,后跟:
,然后再次具有 1 个或多个单词字符。
因此,您需要在调用boost::sregex_token_iterator
中将-1
替换为1
以获取组 1文本块并将您使用的正则表达式替换为w+:w+
模式:
boost::regex re(R"(#.*|(w+:w+))");
boost::sregex_token_iterator i(line.begin(), line.end(), re, 1), end;
请注意,R"(#.*|(w+:w+))"
是一个原始字符串文本,它实际上表示#.*|(w+:w+)
模式与#
匹配,然后表示行的其余部分或匹配并将所需的模式捕获到组 1 中。
请参阅std::regex
C++示例(您可以轻松调整 Boost 的代码(:
#include <string>
#include <iostream>
#include <regex>
using namespace std;
int main() {
std::regex r(R"(#.*|(w+:w+))");
std::string s = "AA:BB CC:DD EE:FF #this is a comment XX:YY";
for(std::sregex_iterator i = std::sregex_iterator(s.begin(), s.end(), r);
i != std::sregex_iterator();
++i)
{
std::smatch m = *i;
std::cout << m[1].str() << 'n';
}
return 0;
}
相关文章:
- 使用正则表达式regex_search在字符串中查找字符串
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- C++正则表达式无限循环
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 带有多个字符分隔符的正则表达式
- C++ 使用增强正则表达式库时断言崩溃
- 有人可以帮助我处理正则表达式吗?
- 标准库中的任何正则表达式语法是否支持 (?(定义)用于子模式参考?
- 我们可以重新定义正则表达式吗
- 需要支持定义正确的正则表达式
- 如何查找除使用正则表达式定义的句子之外的所有句子
- Boost正则表达式:链接时未定义的引用
- 在自定义库中使用正则表达式时出错
- 用ICU定义正则表达式负查找的边界
- 自定义类型的正则表达式
- 使用Boost c++库将正则表达式替换为自定义替换
- 在Arduino IDE中使用正则表达式库时对"longjmp"的未定义引用
- Qt -如何在QString中定义正则表达式
- 提升正则表达式定义