为什么std :: regex_match会返回true?

时间:2014-12-10 14:49:40

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

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

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

谢谢!

3 个答案:

答案 0 :(得分:5)

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

那样转义点。
     (-)?(\\d)\{0,5\}(.)?(\\d)\{0,10\}
      |               |
catures the first `-` | This captures the second `-`

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

DEMO

答案 1 :(得分:0)

因为在(-)?(\\d)\{0,5\}(.)?中,您可以选择匹配-。校验。然后,\\d最多五次。校验。然后,任何事情都与.一致。校验。余数为\\d,最多为十次。检查。

要点在-.,其中--再次匹配。

答案 2 :(得分:0)

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

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