2014-03-05 79 views
-1

我做了一个python正则表达式,现在我应该用C++编写程序。Boost正则表达式不匹配

我被告知使用boost的正则表达式由各自的人。

它应该匹配一组至少包含1到80个下部字母数字字符,包括下划线后面跟一个反斜杠,然后另一组至少一个到80个下部字母数字字符再次包括一个下划线和最后一个但不是至少一个问号。总的字符串必须是至少1个字符长不得超过256

这里是我的Python的正则表达式:

^((?P<grp1>[a-z0-9_]{1,80})/(?P<grp2>[a-z0-9_]{1,80})([?])){1,256}$ 

我的电流提升正则表达式是:

^(([a-z0-9_]{1,80})\/([a-z0-9_]{1,80})([?])){1,256}$ 

砍倒基本上我的代码是这样的:

boost::cmatch match; 
bool isMatch; 
boost::regex myRegex = "^(([a-z0-9_]{1,80})\/([a-z0-9_]{1,80})([?])){1,256}$"; 
isMatch = boost::regex_match(str.c_str(), match, myRegex); 

编辑:哎呦完全忘了问题的xDD。我的问题很简单:正则表达式不匹配,虽然它应该。

示例匹配将是:

  • 一些/更多?
  • 对象/值?
  • devel42/version_number?
+1

你能举一个不起作用的例子吗?我只是[试了一个测试](http://coliru.stacked-crooked.com/a/62da63bf5120eb97),它打印的是真的。虽然你的例子有一些小错误。 –

+0

@JesseGood这应该是答案,因为你修正了次要的错误。 – tgmath

+0

我做了一个编辑并发布了一些应该匹配的示例。我还测试了在线页面,并对它们进行了处理。 @tgmath我已经尝试了反斜杠之前没有斜杠的正则表达式(应该从我从正常表达式的页面中理解的内容中跳出反斜杠符号),我还试过[/],而不是我遇到的问题不幸的是.. –

回答

0

实际的错误是一个new line由客户端发送到服务器输入相应的字符串,将在稍后进行比较。

有趣的是,错误根目录很少出现在您期望的位置。

无论如何,谢谢大家的答案。他们给了我清理我的正则表达式的能力。

1

最后一项要求

The total string must be at least 1 character long and is not allowed to exceed 256.

始终是真实的为您的字符串已经从3到162个字符的限制。你只有让你的正则表达式的第一部分:

^[a-z0-9_]{1,80}/[a-z0-9_]{1,80}\?$ 
+0

其实你是对的。我会试试这个...没有它仍然不能工作:我不明白这一点。另一个正则表达式我做的也是一样的,除了一个不同的正则表达式。 –

+0

@PascalNeubert:你得到了什么错误?我想其他地方有一个错误,因为正则表达式非常简单,我相信它很好。不幸的是,我不知道boost :-( – Toto

+0

没有错误,它只是不匹配。(返回false而不是true) –

1

我的G ++给我的警告,“不知名的转义符:‘\ /’”;这意味着你应该使用“\\ /”而不是“\ /”。您需要在字符串中存储反斜杠字符,然后让正则表达式解析器将其作为转义触发器来使用。

顺便说一句,我的提升还需要一个构造函数调用,所以

boost::regex myRegex("^(([a-z0-9_]{1,80})\\/([a-z0-9_]{1,80})([?])){1,256}$");

似乎工作。

您还可以使用C++ 11的原始字符串字面量,以避免C++转义:

boost::regex myRegex(R"(^(([a-z0-9_]{1,80})\/([a-z0-9_]{1,80})([?])){1,256}$)");

顺便说一句,在测试的libstdC++ <regex> SVN是值得欢迎的。它应该与GCC 4.9;)

+0

使用构造函数调用我得到错误:'''/ home/pneubert/Projects/Gerrit/(boost :: regex {aka boost :: basic_regex >})(const char [37])'''general:simplecomm/Parser.cpp:5:error:no match to call to' '好吧,我使用“\\ /”而不是“\ /”来修饰。仍然不匹配:/ –

+0

@PascalNeubert我的增强版本是1.55.0顺便说一句,我没有看到任何理由逃避'/'你可以尝试'“^(([a-z0-9 _] {1,80})/([a-z0-9 _] {1,80})([?])){1,256} $”' –

+0

是的,测试它没有逃脱和逃脱没有关系。一直在工作的那个仍然有效,另一个正则表达式没有。 –