使用 Boost 澄清逻辑 AND 和 OR 的正则表达式匹配

Posted

技术标签:

【中文标题】使用 Boost 澄清逻辑 AND 和 OR 的正则表达式匹配【英文标题】:Clarification on regular expression matching for logical AND and OR with Boost 【发布时间】:2013-11-22 00:49:27 【问题描述】:

我需要使用正则表达式匹配两种类型的字符串:

//Look for "keyboard" AND "mouse"
(?=.*keyboard)(?=.*mouse)

//Look for "keyboard" OR "mouse"
(keyboard)|(mouse)

我使用 Boost 库运行此代码:

static const boost::regex e("(?=.*keyboard)(?=.*mouse)");
string chat_input("keyboard & mouse");
boost::match_results<std::string::const_iterator> results;
if (boost::regex_match(chat_input, results, e))

    //Got a match

两个正则表达式都返回no match。我是否使用了错误的语法?

【问题讨论】:

【参考方案1】:

boost::regex_match 默认是完全匹配,所以你可以使用这个正则表达式".*(keyboard|mouse).*" 来匹配字符串。或者你可以再传递一个参数让它进行部分匹配。

boost::regex_match(chat_input, results, e, boost::match_default | boost::match_partial)

见http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/boost_regex/ref/regex_match.html

"算法regex_match判断给定的正则表达式是否匹配由一对双向迭代器表示的给定字符序列的all,算法定义如下,该函数的主要用途是数据输入验证。”

和http://www.boost.org/doc/libs/1_55_0/libs/regex/doc/html/boost_regex/partial_matches.html

【讨论】:

我应该改用boost::regex_search,它会起作用的。

以上是关于使用 Boost 澄清逻辑 AND 和 OR 的正则表达式匹配的主要内容,如果未能解决你的问题,请参考以下文章

使用来自流的 boost binary_iarchive 序列化和反序列化

boost.tribool

boost asio 学习 boost::asio 网络封装

用孔收缩/扩展多边形的轮廓

Gridsearchcv:内部逻辑

Prolog 否定和逻辑否定