正则表达式匹配序列

时间:2012-03-02 15:00:12

标签: c++ regex string boost match

我想要一个regeular表达式来匹配序列。 我希望正则表达式匹配的顺序是NP,所以要确保在N之后有一个P并且在P之前存在N的字符串一直向下

1)NPNPNPNP =正确

2)NPNPPNP =不正确

抱歉的家伙我错过了第三部分与第三部分相关的部分

3)NNNPNPNNP =正确所以可以有很多N,但在N的末尾必须有一个P跟随上面

但我不认为我的正则表达是正确的,有人能告诉我哪里出错了吗?

std::string a ("NPNPNPPN");
 boost::regex const string_matcher("\(NP\)*");
 if(boost::regex_match(a,string_matcher))
 {
     DCS_LOG_DEBUG("Yes it Matches ");
 }
 else
 {
     DCS_LOG_DEBUG("No it does not Match");
 }

4 个答案:

答案 0 :(得分:5)

编辑:根据要求变更和评论更新&建议

^(N+P)+$

Here it is with some tests

进一步阅读正则表达式http://www.regular-expressions.info/tutorial.html

答案 1 :(得分:2)

对于修改后的问题,NP对由1个或多个N组成,后跟单个P,正则表达式为:

^(?:N+P)+$
  • 这是一个非捕获括号(?:
  • 后跟一个或多个N N+
  • 后跟P:P
  • 关闭括号,以便我们匹配NP类型对:)
  • 后跟+以确保至少存在一个NP类型对。 (即必须有一些东西要匹配。
  • 整个表达式用w / ^和+包围,所以它只是NP类型对。

如果您希望它不区分大小写,请将regex_constants::icase添加到正则表达式构造函数中。

答案 2 :(得分:0)

使用boost正则表达式,^(?:[^NP]*NP)*[^NP]*$应该可以解决问题,我 认为。除NP之外的任何序列,后跟NP, 尽可能多地重复,然后是N或以外的任何内容 一个P。从文本开头开始,一直持续到 结束。 (如果不允许NP以外的其他字符,那么 只需要^(?:NP)*$。)

这是使用默认设置(Perl正则表达式,我认为)。

答案 3 :(得分:-1)

试试这个

 boost::regex const string_matcher("^(NP)*$");