【问题标题】:Why std::regex_match will return true?为什么 std::regex_match 会返回 true?
【发布时间】:2015-02-08 19:43:09
【问题描述】:

有人可以向我解释一下 - 为什么这段代码会在 std::regex_match 之后返回 true 吗?

std::regex reg("(-)?(\\d)\{0,5\}(.)?(\\d)\{0,10\}");
std::string str("--");
std::regex_match(str, reg);

谢谢!

【问题讨论】:

  • 另一件事是,{} 如果您使用它们来表示量词,则不需要转义。 \{ 和 \} 在程序编译时会变成 { 和 },因为它们不是有效的转义序列。而且没有必要写(-)?或(.)?,写-?和.?(好吧,除非你想捕获它们)。

标签: c++ regex visual-c++ c++11


【解决方案1】:

因为您将一些捕获组设为可选,而将一些捕获组重复零次或多次。 (\\d)\{0,5\} 重复前一个令牌 \\d 0 到 5 次。 (-)? 会将捕获组变为可选。所以- 符号可能出现也可能不出现。 . 是正则表达式中的一个特殊元字符,它匹配除换行符以外的任何字符(\n、\r)。但在 DOTALL 模式下,点也会匹配换行符(在其他语言中)。要匹配文字点,您需要将点放在像 [.] 这样的字符类中,或者您需要像 \\. 一样转义点

     (-)?(\\d)\{0,5\}(.)?(\\d)\{0,10\}
      |               |
catures the first `-` | This captures the second `-`

请注意,这个正则表达式也匹配一个空字符串。

DEMO

【讨论】:

  • 嗯,但是 - 和 .是不同的符号,我应该怎么做才能告诉程序 - 是减号和 .是点吗?
  • . 是正则表达式中的一个特殊元字符。要匹配文字点,您需要将点放在字符类中,如[.],或者您需要转义点,如\\.
  • 谢谢!但现在我最多不能输入 5 位数字 - 取而代之的是,我可以输入更多数字。看起来很奇怪
  • 您需要包含开始和结束锚点。像 ^(\\d)\{1,5\}$ 只允许 1 到 5 位数字。
  • ECMAScript 正则表达式中没有 DOTALL 模式(这是 C++ 正则表达式默认基于的)。
【解决方案2】:

因为在(-)?(\\d)\{0,5\}(.)? 中,您可以选择匹配-。查看。然后,\\d 最多五次。查看。然后,任何事情都与. 相关。查看。剩下的又是\\d,最多十次。检查。

要点在于- 和.,它们再次匹配- 和-。

【讨论】:

    【解决方案3】:

    看起来你试图解析一个数字。你犯了一个错误: '。'表示正则表达式中的任何符号,因此您应该将其屏蔽以使其仅匹配点本身:

    std::regex reg("(-)?(\\d)\{0,5\}(\\.)?(\\d)\{0,10\}");
    

    【讨论】:

      猜你喜欢
      • 2017-03-04
      • 2023-02-16
      • 2022-01-25
      • 1970-01-01
      • 2021-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      相关资源
      最近更新 更多