【问题标题】:Regular Expression to match a sequence正则表达式匹配一个序列
【发布时间】:2012-03-02 15:00:12
【问题描述】:

我想要一个正则表达式来匹配一个序列。 我希望正则表达式匹配的序列是 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");
 }

【问题讨论】:

  • i do not think my regular expression is correct 为什么?你的哪个测试失败了?为什么要逃避()
  • 对于空字符串"" 是成功还是失败,下面的答案各不相同。它是哪一个?你可以在序列之前或之后有非NP字母,还是字符串只能由NP对组成?
  • 是的,我认为我不需要逃避() 现在考虑@LightnessRacesinOrbit
  • 空的 "" 并不总是成功,有时订单可能是 NPPN 在这种情况下我需要发出错误信号@MikeRyan
  • 我认为您没有理解我的第一个问题——"" 成功或失败。通过在您的原始代码中使用*,您暗示它应该成功,但您的作品表明您没有考虑这种情况。 NPPN 不是空字符串的示例。至于我的第二个,我问的是“123NPNP”应该成功还是失败?

标签: c++ regex string boost match


【解决方案1】:

编辑:根据需求更改和 cmets 和建议进行更新

^(N+P)+$

Here it is with some tests

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

【讨论】:

  • 为什么不在正则表达式构造函数中添加regex_constants::icase 而不是重复这些字母?
  • 因为我无法用 rubular 测试它
  • 它必须成功的另一个顺序是 NNNPNP 以及 P 之前的多个 N
  • 如果不区分大小写,请确保您可以在 Rubular 中进行测试。如果您在右侧的选项字段中添加i(在/ 之后),那就是Ruby 版本的不区分大小写。
【解决方案2】:

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

^(?:N+P)+$
  • 这是一个非捕获括号(?:
  • 后跟 1 个或多个 N 的 N+
  • 后跟一个 P:P
  • 右括号,允许我们匹配 NP 类型对:)
  • 后跟 + 以确保至少存在一个 NP 类型对。 (即必须有匹配的东西。
  • 整个表达式用 ^ 和 + 包围,因此它只是 NP 类型对。

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

【讨论】:

    【解决方案3】:

    使用 boost 正则表达式,^(?:[^NP]*NP)*[^NP]*$ 应该可以解决问题,我 思考。除了NP 之外的任何序列,后跟NP, 尽可能频繁地重复,然后是 N 以外的任何内容或 P。从正文开始,一直持续到正文 结尾。 (如果除了NP 之外没有其他字符被允许,那么 ^(?:NP)*$ 就足够了。)

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

    【讨论】:

      【解决方案4】:

      试试这个

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

      【讨论】:

      • 是的,另一个匹配项是NNNPNPNP,所以在 P 之前有多个 N,而在 N 之后只是一个 * 对吗? @LightnessRacesinOrbit
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-08
      相关资源
      最近更新 更多