为什么 std::regex_match 将返回 true

Why std::regex_match will return true?

本文关键字:返回 match true std regex 为什么      更新时间:2023-10-16

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

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

谢谢!

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

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

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

演示

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

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

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

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