我正在使用boost regex_match,我遇到了匹配没有制表符的问题。 我的测试应用程序如下所示:
#include <iostream>
#include <string>
#include <boost/spirit/include/classic_regex.hpp>
int
main(int args, char** argv)
{
boost::match_results<std::string::const_iterator> what;
if(args == 3) {
std::string text(argv[1]);
boost::regex expression(argv[2]);
std::cout << "Text : " << text << std::endl;
std::cout << "Regex: " << expression << std::endl;
if(boost::regex_match(text, what, expression, boost::match_default) != 0) {
int i = 0;
std::cout << text;
if(what[0].matched)
std::cout << " matches with regex pattern!" << std::endl;
else
std::cout << " does not match with regex pattern!" << std::endl;
for(boost::match_results<std::string::const_iterator>::const_iterator it=what.begin(); it!=what.end(); ++it) {
std::cout << "[" << (i++) << "] " << it->str() << std::endl;
}
} else {
std::cout << "Expression does not match!" << std::endl;
}
} else {
std::cout << "Usage: $> ./boost-regex <text> <regex>" << std::endl;
}
return 0;
}
如果我使用这些参数运行程序,我得不到预期的结果:
$> ./boost-regex "`cat file`" "(?=.*[^\t]).*"
Text : This text includes some tabulators
Regex: (?=.*[^\t]).*
This text includes some tabulators matches with regex pattern!
[0] This text includes some tabulators
在这种情况下,我原以为 what [0] .matched 是假的,但事实并非如此。
我的正则表达中是否有任何错误?
或者我是否必须使用其他格式/匹配标志?
提前谢谢!
答案 0 :(得分:2)
我不确定你想做什么。我的理解是,一旦文本中有一个标签,你就希望正则表达式失败。
一旦找到非标签页,您的正面预测断言(?=.*[^\t])
就为真,并且您的文字中有很多非标签。
如果你想让它失败,当有一个标签时,反过来使用否定的先行断言。
(?!.*\t).*
一旦找到标签,这个断言就会失败。