有人可以向我解释一下 - 为什么这段代码会在std :: regex_match之后返回true?
std::regex reg("(-)?(\\d)\{0,5\}(.)?(\\d)\{0,10\}");
std::string str("--");
std::regex_match(str, reg);
谢谢!
答案 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 `-`
请注意,此正则表达式也匹配空字符串。
答案 1 :(得分:0)
因为在(-)?(\\d)\{0,5\}(.)?
中,您可以选择匹配-
。校验。然后,\\d
最多五次。校验。然后,任何事情都与.
一致。校验。余数为\\d
,最多为十次。检查。
要点在-
和.
,其中-
和-
再次匹配。
答案 2 :(得分:0)
看起来你试图解析一个数字。你犯了一个错误:'。'表示正则表达式中的任何符号,因此您应该屏蔽它以使其仅匹配点本身:
std::regex reg("(-)?(\\d)\{0,5\}(\\.)?(\\d)\{0,10\}");