Boost:regex_search - 括号之间的匹配字符串

Posted

技术标签:

【中文标题】Boost:regex_search - 括号之间的匹配字符串【英文标题】:Boost:regex_search - match string between brackets 【发布时间】:2011-07-20 20:47:31 【问题描述】:

鉴于 LogString 的这一部分:

... HTTP/1.1" 206 391402 "-" "AppleCoreMedia/1.0.0.8B117 (iPod; U; CPU OS 4_1,如 Mac OS X; de_de)"

我需要匹配括号内的最后一个子字符串以从字符串中获取远程系统信息。

我并不是很喜欢正则表达式,但据我了解,我必须避开括号,如“\(”和“\)”。

现在要匹配整个字符串,我认为我必须这样做:

\(\.*\) 点匹配任何内容,“*”用于指定随机点数。

但它不起作用。 (\.*)(.*) 也不如您所料。

打开和关闭括号一定有问题,因为我在尝试以这种方式匹配字符串时遇到 Seg Fault。

谁能帮帮我?

【问题讨论】:

我添加了 boost 和 C++ 标签,我认为你应该发布你的代码,你如何调用正则表达式。我很确定正则表达式本身不会出现内存访问冲突(但我不是 C++/Boost 专家) 【参考方案1】:

好的,打扰您了。这成功了:

boost::regex f_sourceDir(conf.pString("filter_SourceFiles")),
        f_string(conf.pString("filter_String")),
        m_first(conf.pString("field0")),
            m_second("\\(([^)]+)\\)\"$",boost::regex::perl),
        m_third(conf.pString("field2")),
        m_fourth(conf.pString("field3"));

似乎是解析配置的问题,无法处理这样的字符串。我想我必须更改 Config 类...

谢谢!

【讨论】:

【参考方案2】:

试试这个

\(.*\)

看here on Regexr

您只需要转义括号,而不是 .。如果您转义 .,那么您将匹配一个文字点,并且不会找到它。

如果您不想使用括号,那么这里是使用捕获组的解决方案

 \((.*)\)

看here on Regexr

您可以找到存储在捕获组 1 中的括号内的部分。

【讨论】:

感谢您的回复,但这两种情况都会导致内存访问冲突【参考方案3】:

以防万一,有两种使用正则表达式处理字符串的方法:匹配和搜索。匹配要么匹配整个字符串,要么失败,搜索不必匹配整个字符串。你正在做的是搜索。

使用 Perl 语法(boost::regex 让您选择语法)所需的表达式类似于:

\(([^)]+)\)"$

即:在括号内找到一个或多个非右括号符号的子字符串,后跟“”和字符串的结尾。

在 C++ 中你需要引用这个表达式:

boost::regex re("\\(([^)]+)\\)\"$", boost::regex::perl);

【讨论】:

以上是关于Boost:regex_search - 括号之间的匹配字符串的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式搜索匹配不使用组

c++ 类的堆成员的声明及使用

如何提取括号(圆括号)之间的文本?

如何使用 Jquery 将光标聚焦在两个括号(括号)之间?

删除括号之间的文本,但仅在给定条件下

带括号或方括号的箭头函数之间的区别[重复]