2013-03-17 36 views
1

我想在我的一个项目中使用boost正则表达式。 其实我将我的一个软件移植到C++,它非常依赖正则表达式。Boost :: regex奇怪的行为

我看到一些与我以前使用其他Regex库有关的经验。 我希望有人可以帮助我理解或让我知道是否有额外的标志,我可以使用提升来实现我的要求。

这里是主题字符串:

This is an example to test regex `54 6767 98` thats it 

当我使用这个表达式:\\\d*,我希望得到54结果 (当我在Delphi中使用的.Net正则表达式或TperlRegex这恰好),但是当我使用boost,函数返回TRUE,但cmatch是空的!

这是正常的吗?我知道我可以使用\d+。但这不是我需要它工作的关键,因为它会成为我在我的软件中使用的更复杂的正则表达式中的许多其他问题的原因。

这里是代码的方式:

cmatch what; 
boost::regex re("\\d*", regex::perl | regex::icase); 
std::string ssub = "something 54 67 979 some text"; 
if (boost::regex_search(ssub.c_str(), what , re) 
    return what[0]; 

我想应该在这种情况下返回54,但事实并非如此。 正如我所料,它在/ Regex和TperlRegex中工作。

Regards

+0

'*'匹配0或更多。你要 '?'匹配1个或更多。 – stark 2013-03-17 11:34:28

+0

@stark:错误。 '?'匹配0或1.'+'匹配1或更多。但在这里并不重要,因为引擎应该是贪婪的并且吃掉可以通过'\ d *'匹配的最长的字符串。 – nhahtdh 2013-03-17 11:39:06

+0

对不起,意思是+。 ANyway,\ d *匹配字符串的开头。 – stark 2013-03-17 11:49:07

回答

3

'*'匹配0或更多。你想'+'匹配1或更多。

问题是\ d *会匹配字符串中的任何位置。为了保证它从一个数字开始,使用+。

+1

+1。 http://liveworkspace.org/code/3Kk24s$0。您也可以在调用'regex_search'时使用'match_not_null'标志。 http://liveworkspace.org/code/3Kk24s$1。 – 2013-03-17 12:11:34

+0

非常感谢,但它只是一个简单的例子来展示我的问题。我有许多复杂的正则表达式,因为这个问题不起作用。在这个例子中使用+并不能解决我的问题。 – QProgrammer 2013-03-17 18:21:45

+0

llonesmiz,非常感谢!这就是诀窍!它符合我使用match_not_null标志时的预期。 – QProgrammer 2013-03-17 18:23:25