c++11正则表达式错误
c++ 11 regex error
只是来自C++ Primer 5th Edition: 17.3.3. Using the Regular Expression Library
的示例代码
主文件main.cpp
:
#include <iostream>
#include "regexcase.h"
using namespace std;
int main() {
using_regex();
return 0;
}
头文件regexcase.h
:
#ifndef REGEXCASE_H_
#define REGEXCASE_H_
#include <regex>
#include <string>
void using_regex();
std::string parseCode(std::regex_constants::error_type etype);
#endif /* REGEXCASE_H_ */
源文件regexcase.cpp
:
#include "regexcase.h"
#include <iostream>
using namespace std;
void using_regex() {
// look for words that violate a well-known spelling rule of thumb, "i before e, except after c":
// find the characters ei that follow a character other than c
string pattern("[^c]ei");
// we want the whole word in which our pattern appears
pattern = "[a-zA-Z]*" + pattern + "[a-zA-Z]*"; //[a-zA-Z]* [[:alpha:]]*
try {
regex r(pattern, regex_constants::extended); // construct a regex to find pattern // , regex_constants::extended
smatch results; // define an object to hold the results of a search
// define a string that has text that does and doesn't match pattern
string test_str = "receipt freind theif receive";
// use r to find a match to pattern in test_str
if (regex_search(test_str, results, r)) // if there is a match
cout << results.str() << endl; // print the matching word
else
cout << "no match for " << pattern << endl;
} catch (regex_error &e) {
cout << "what: " << e.what() << "; code: " << parseCode(e.code()) << endl;
}
}
string parseCode(regex_constants::error_type etype) {
switch (etype) {
case regex_constants::error_collate:
return "error_collate: invalid collating element request";
case regex_constants::error_ctype:
return "error_ctype: invalid character class";
case regex_constants::error_escape:
return "error_escape: invalid escape character or trailing escape";
case regex_constants::error_backref:
return "error_backref: invalid back reference";
case regex_constants::error_brack:
return "error_brack: mismatched bracket([ or ])";
case regex_constants::error_paren:
return "error_paren: mismatched parentheses(( or ))";
case regex_constants::error_brace:
return "error_brace: mismatched brace({ or })";
case regex_constants::error_badbrace:
return "error_badbrace: invalid range inside a { }";
case regex_constants::error_range:
return "erro_range: invalid character range(e.g., [z-a])";
case regex_constants::error_space:
return "error_space: insufficient memory to handle this regular expression";
case regex_constants::error_badrepeat:
return "error_badrepeat: a repetition character (*, ?, +, or {) was not preceded by a valid regular expression";
case regex_constants::error_complexity:
return "error_complexity: the requested match is too complex";
case regex_constants::error_stack:
return "error_stack: insufficient memory to evaluate a match";
default:
return "";
}
}
调用using_regex();
的输出为what: regex_error; code: error_brack: mismatched bracket([ or ])
regex似乎无法解析括号。
参考这个问题中的答案,我使用regex_constants::extended
初始化regex对象,然后它就是regex r(pattern, regex_constants::extended);
则输出为no match for [[:alpha:]]*[^c]ei[[:alpha:]]*
regex似乎无法匹配模式。
然后我使用[a-zA-Z]*
来替换字符类[[:alpha:]]*
(仍然设置有regex_constants::extended
)。输出仍然是no match for [a-zA-Z]*[^c]ei[a-zA-Z]*
平台:windows
使用的工具:Eclipse for C/C++
;MinGW (g++ --version: g++ 4.7.2)
编辑:感谢@sharth,添加主文件以完成代码。
我刚刚用libc++和clang++做了一个测试。这是意料之中的事。这是我的主菜:
int main() {
string test_str = "receipt freind theif receive";
string pattern = "[a-zA-Z]*[^c]ei[a-zA-Z]*";
try {
regex r(pattern, regex_constants::extended);
smatch results;
if (regex_search(test_str, results, r))
cout << results.str() << endl;
else
cout << "no match for " << pattern << endl;
} catch (regex_error &e) {
cout << "what: " << e.what() << "; code: " << parseCode(e.code()) << endl;
}
}
输出:
freind
另一方面,GCC 4.7.2给出了以下结果:
no match for [a-zA-Z]*[^c]ei[a-zA-Z]*
这是因为在GCC 4.7.2的libstdc++中,它们仍然没有实现regex。以下是regex_search
:的实现
template<typename _Bi_iter, typename _Allocator, typename _Ch_type, typename _Rx_traits>
inline bool regex_search(_Bi_iter __first, _Bi_iter __last, match_results<_Bi_iter, _Allocator>& __m, const basic_regex<_Ch_type, _Rx_traits>& __re, regex_constants::match_flag_type __flags) {
return false;
}
需要注意的是,包含一个读者可以编译的小程序是非常有帮助的。这样就不会混淆正在运行的代码。
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- FindPackageHandleStandardArgs.cmake:137 的 CMake 错误(消息):找不到 Boost (缺少:正则表达式)(找到合适的版本"1.72.0",
- std::正则表达式捕获组语法错误
- 带有正则表达式的 c++ 中的错误
- 为什么这个正则表达式在 STL 世界中是错误的?
- C++抛出错误"Invalid special open parenthesis."中的正则表达式
- 正则表达式分段错误
- 使用boost正则表达式时出现shared_ptr错误
- 正则表达式中带有卷轴大括号的正则表达式错误
- 提升正则表达式错误:未初始化的提升::match_results
- C++ 正则表达式错误(未处理的异常)
- 提升正则表达式中的链接器错误
- Ubuntu 上的正则表达式错误
- C++正则表达式错误
- Mingw32-w64 GCC 4.9.2 正则表达式错误,或者我不知道C++
- 函数正则表达式C++在 linux(CentOS) 中遇到错误,但在 OSX 中
- 在 C++14 模式下为 libstdc++ 编译 clang 正则表达式程序会导致错误
- boost的正则表达式错误
- 在c++中使用正则表达式时出现错误
- 提升::正则表达式在长表达式不匹配时抛出错误