有以下 QRegExp: QRegExp numberRegExp("^(7|8){1}\d{8,10}$");
- 要检查 +7********** 或 +8********** 格式的电话号码(不指定 + 号 - 纯粹是示例),检查表达式在https://regex101.com/ - PCRE 格式,但是,当检查时:
numberRegExp.exactMatch("some number")
- 返回 false。
我将澄清这一行 - 只有数字,仅此而已,在上面的网站上 - 有一个完整的匹配,也就是说,根据文档 - exactMatch
- 应该返回 true。
有效数字示例:
71234567891,
81234567891,
7123456789,
8123456789,
712345678,
812345678
- 即,由一位数字组成的前缀 - 7 或 8 以及前缀后的 8 到 10 位数字。
ps - 我想不出更好的标题,我会感谢建议的编辑和更合适的选项。谢谢。
双反斜杠字符:
问题是您的字符串文字包含缺少的文本
^(7|8)d{8,10}$
,\
因为没有字符串转义序列\d
,并且 C++ 内核从这种无效的转义序列中去除了反斜杠。始终从正则表达式中删除
{1}
,因为默认情况下会找到一次无法量化的字符/模式。细节
请记住:正则表达式是文字文本。可以在程序代码中以不同的方式指定文本,例如,从文件中读取,使用字符串常量/文字分配值。
您的代码使用“常规字符串文字”。此类字符串文字支持字符串转义序列。例如,
2+"2"
程序文本中的文本可以使用"2+\"2\""
带有双引号作为分隔符的常规字符串文字来指定。您也可以在表单中设置它"2\x2B\x222\x22"
。是的,在某些语言中你可以使用不同种类的引号来避免过多的反斜杠,例如在 Python 中你可以写'2+"2"'
.在普通字符串文字中,反斜杠字符是“特殊的”,为了在字符串中设置文字字符本身
\
,您需要“转义”它本身,即 本质上,它需要加倍。正则表达式转义序列的第一个字符是文字反斜杠字符。正则表达式转义序列是众所周知的\d
,\w
,\s
,\D
,\W
,\S
,\b
,\B
,\\
,\uXXXX
,\xNN
,\+
,\$
,\)
等等。是的,,\b
,\uXXXX
可以\xNN
是两种类型的字符:"\b"
是 BACKSPACE 字符"\x08"
,, 而"\\b"
是单词边界。\uXXXX
并且\xNN
在指定为字符串转义序列和正则表达式转义序列(Unicode 字符)时具有相同的含义。在 C++ 和许多其他语言中,可以使用不支持字符串转义序列的字符串文字来指定文本变量。这些是所谓的“原始”字符串文字、“原始字符串文字”(C# 中的“逐字字符串文字”等)。在 C++ 中,您可以使用前缀来指定这样的文字
R
。字符串文字R"(\d{3})"
(等于"\\d{3}"
)存储 text\d{3}
,即用于搜索三个连续数字的正则表达式模式。请注意,括号是分隔符,是字符串文字的功能部分,它们根本没有在正则表达式中定义额外的捕获子模式。