- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我刚开始使用 Boost::xpressive 并发现它是一个优秀的库...我浏览了文档并尝试使用 !运算符(零或一),但无法编译 (VS2008)。
我想匹配一个可能以或不以“sip:”开头的 sip 地址
#include <iostream>
#include <boost/xpressive/xpressive.hpp>
using namespace boost::xpressive;
using namespace std;
int main()
{
sregex re = !"sip:" >> *(_w | '.') >> '@' >> *(_w | '.');
smatch what;
for(;;)
{
string input;
cin >> input;
if(regex_match(input, what, re))
{
cout << "match!\n";
}
}
return 0;
}`
最佳答案
您刚刚遇到了一个困扰大多数 DSEL 的错误。
问题是您希望调用一个特定的运算符,该运算符实际上是用您的特定语言定义的。然而,此运算符已存在于 C++ 中,因此适用查找和重载解析的正常规则。
正确运算符的选择是通过 ADL(参数相关查找)完成的,这意味着运算符所应用的至少一个对象应该是 DSEL 本身的一部分。
例如,考虑这个简单的代码片段:
namespace dsel
{
class MyObject;
class MyStream;
MyStream operator<<(std::ostream&, MyObject);
}
int main(int, char*[])
{
std::cout << MyObject() << "other things here";
}
因为表达式是从左到右计算的,dsel::MyObject
的存在是病毒式的,即 dsel 将在这里传播。
关于 Xpressive
,大多数时候它之所以有效,是因为您使用了特殊的“标记”,这些标记是 Xpressive
类型的实例,例如 (_w
) 或因为病毒效应(例如“@”起作用是因为 >>>
左边的表达式与 Xpressive
相关)。
你是否使用过:
sregex re = "sip:" >> *(_w | '.') >> '@' >> *(_w | '.');
^^^^^^ ~~ ^^^^^^^^^^^
Regular Xpressive
它会起作用,因为由于运算符的优先规则,右侧参数被 Xpressive
“污染”了。
但是这里 operator!
具有最高的优先级之一。因此,其范围仅限于:
`!"sip:"`
并且由于 "sip:"
是 char const[5]
类型,它只调用常规的 operator!
,这将正确地得出结论它所应用的表达式为 true
,因此求值为 bool
值 false
。
通过使用 as_xpr
,您可以将 C 字符串转换为 Xpressive
对象,从而从 中引入正确的
命名空间,并适本地启动重载解析。operator!
考虑到 code>Xpressive
关于c++ - boost 表现力!接线员不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3708599/
我刚开始使用 Boost::xpressive 并发现它是一个优秀的库...我浏览了文档并尝试使用 !运算符(零或一),但无法编译 (VS2008)。 我想匹配一个可能以或不以“sip:”开头的 si
我想用 boost 匹配一个简单的表达式,但它的行为很奇怪......下面的代码应该匹配并显示第一个和第二个字符串中的“a”: #include #include #include "stdio.
我一直致力于 Protege 中的 Ontology。 我从在 Protege 中被归类为“DL Expressivity: SROIF(D)”的高表现力开始。 如果我是正确的,字母表示 - 按顺序
Zend Expressive 在使用 Zend View 时默认使用 layout 模板。我注意到 PhpRenderer 类中的 addTemplate($template) 函数,但是在哪里以及
我是一名优秀的程序员,十分优秀!