- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试测试(使用 boost::regex
)文件中的一行是否仅包含由空格分隔的数字条目。我遇到了一个我不明白的异常(见下文)。如果有人能解释为什么抛出它,那就太好了。也许我在这里以定义模式的方式做了一些愚蠢的事情?这是代码:
// regex_test.cpp
#include <string>
#include <iostream>
#include <boost/regex.hpp>
using namespace std;
using namespace boost;
int main(){
// My basic pattern to test for a single numeric expression
const string numeric_value_pattern = "(?:-|\\+)?[[:d:]]+\\.?[[:d:]]*";
// pattern for the full line
const string numeric_sequence_pattern = "([[:s:]]*"+numeric_value_pattern+"[[:s:]]*)+";
regex r(numeric_sequence_pattern);
string line= "1 2 3 4.444444444444";
bool match = regex_match(line, r);
cout<<match<<endl;
//...
}
我编译成功了
g++ -std=c++11 -L/usr/lib64/ -lboost_regex regex_test.cpp
生成的程序到目前为止运行良好,match == true
如我所愿。但后来我测试了一条输入线,比如
string line= "1 2 3 4.44444444e-16";
当然,我的模式不是为了识别格式 4.44444444e-16
而构建的,我希望 match == false
。但是,我收到以下运行时错误:
terminate called after throwing an instance of
'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::runtime_error> >'
what(): The complexity of matching the regular expression exceeded predefined bounds.
Try refactoring the regular expression to make each choice made by the state machine unambiguous.
This exception is thrown to prevent "eternal" matches that take an indefinite period time to locate.
这是为什么?
注意:我给出的例子是极端的,因为在点之后少放一位数字就可以了。这意味着
string line= "1 2 3 4.4444444e-16";
只是导致 match == false
符合预期。所以,我很困惑。这里发生了什么?
已经谢谢了!
更新:
问题似乎解决了。鉴于 alejrb 的提示我将模式重构为
const string numeric_value_pattern = "(?:-|\\+)?[[:d:]]+(?:\\.[[:d:]]*)?";
这似乎可以正常工作。不知何故,原始模式 [[:d:]]+\\.?[[:d:]]*
中的孤立可选 \\.
留下了许多可能性以不同的方式匹配一长串数字。
我希望模式现在是安全的。但是,如果有人找到使用它以新形式进行爆炸的方法,请告诉我!对我来说这是否仍然可能不是那么明显...
最佳答案
我会说您的正则表达式可能呈指数回溯。为了保护您免受输入时间过长将变得完全无法运行的循环,正则表达式引擎只是中止尝试。
经常导致此问题的模式之一是任何形式的 (x+x+)+
- 当您将第一个模式放在第二个模式中时,您会在此处构建。
http://www.regular-expressions.info/catastrophic.html 上有很好的讨论
关于c++ - 为什么 regex_match 抛出 "complexity exception"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21751874/
这个问题在这里已经有了答案: Is gcc 4.8 or earlier buggy about regular expressions? (3 个答案) 关闭 6 年前。 我正在尝试对其中包含方括
#include`` #include `` #include `` using namespace std; int main () { try{ std::regex re("(http|ht
我在 site 上测试了正则表达式 [BCGRYWbcgryw]{4}\[\d\]似乎可以在以下 BBCC[0].GGRY[0].WWWW[soln] 中找到匹配项。它与 BBCC[0] 和 GGRY
我正在尝试编写递归下降解析器,并尝试在用户输入的字符串中搜索正则表达式的匹配项。我正在尝试执行以下操作以尝试理解 C++11 提供的库,但我得到了意想不到的结果。 std::string expre
我正在尝试检查 yyyy-mm-dd 格式的日期字符串的格式。我像这样调用 regex_match 函数: if (regex_match(date, regex("/\d{4}-\d{2}-\d{2
我正在尝试使用 std::regex_match()作为 std::count_if() 中的谓词与 std::vector类成员函数中的元素。但是不知道如何正确地将第二个参数(正则表达式值)绕过到函
这是我的代码: #include #include #include using namespace std; int main () { string test = "COPY" ;
我正在使用 C++ 正则表达式。无法掌握以下编程输出。 #include #include #include #include using namespace std; int main(){
我在 XCode 上使用 C++。我想使用 regex_match 匹配非字母字符,但似乎有困难: #include #include using namespace std; int main(
这个问题在这里已经有了答案: Is gcc 4.8 or earlier buggy about regular expressions? (3 个答案) 关闭 5 年前。 我有这段代码片段,是我从
这是我的部分代码 bool CSettings::bParseLine ( const char* input ) { //_asm INT 3 std::string line (
我试图弄清楚我在这个验证规则上做错了什么,因为它说了这个错误。 验证规则: $this->form_validation->set_rules('username', 'Username', 'tri
在我的代码中,我想根据封闭的 <> 括号处理 stirngs。为此,我想遍历字符串并一个一个地替换括号并根据括号内的内容做一些事情。 string msg = "This is an Example<
目标是:这个 json: {"secretWord1":"private", "something": "\"secretWord2\":\"privateToo\""} 通过 regex_match
这是我的程序: #include "stdafx.h" #include #include #include #include using namespace std; int _tmain(
我必须编写一个 C++ 正则表达式,但我无法在 regex_match 上获得正确的结果,因为我是 C++ 的新手。测试字符串为:D10A7;让我们说 unsigned_char[] stringTo
我有一些我认为应该触发的 boost Regex 代码。我是 boost 的新手,但我对 Regex 有一点了解。这是我正在使用的代码。 re = boost::basic_regex(_T("-+\
我想匹配输入字段中给定的字符串。 A sample data could be "hello" -> returns true or "\"" -> returns true or "this is
我知道: 惰性量词匹配:尽可能少(最短匹配) 还知道构造函数: basic_regex( ..., flag_type f = std::regex_constants::EC
这个问题在这里已经有了答案: Simple std::regex_search() code won't compile with Apple clang++ -std=c++14 (3 个答案)
我是一名优秀的程序员,十分优秀!