Qt 5.12--正则表达式

1 简介

  • QRegExp类使用正则表达式提供模式匹配。
  • QRegExp基于Perl的正则表达式语言。 它完全支持Unicode。 QRegExp也可以在更简单的通配符模式下使用,类似于命令外壳中的功能。 QRegExp使用的语法规则可以通过setPatternSyntax()进行更改。 特别地,可以将模式语法设置为QRegExp :: FixedString,这意味着要匹配的模式被解释为纯字符串,即特殊字符(例如,反斜杠)不会被转义。
  • 正则表达式由表达式,量词和断言构成。 最简单的表达方式是字符,例如 x或5。表达式也可以是用方括号括起来的一组字符。 [ABCD]将与A或B或C或D匹配。我们可以将此表达式写成与[A-D]相同,并且将匹配英语字母表中任何大写字母的表达式写为[A-Z]。
  • 量词指定必须匹配的表达式的出现次数。 x {1,1}表示匹配一个,并且只能匹配一个x。 x {1,5}表示匹配包含至少一个x但不超过五个的x个字符序列。
  • 请注意,一般而言,正则表达式不能用于检查方括号或标记是否平衡。 例如,如果未嵌套标记,但是如果嵌套标记,则可以编写正则表达式以匹配开头的html 及其结束</ b>,该正则表达式将匹配 用错误的结束</ b>打开标记。 对于片段 bold bolder </ b> </ b>,第一个将与第一个</ b>匹配,这是不正确的。 但是,只有在嵌套级别的数目是固定的且已知的情况下,才可以编写与嵌套括号或标签正确匹配的正则表达式。 如果嵌套级别的数目不是固定的并且是已知的,则不可能编写不会失败的正则表达式。
  • 假设我们希望一个正则表达式匹配0到99范围内的整数。至少需要一位数字,所以我们从表达式[0-9] {1,1}开始,它仅一次匹配一位数字。 此正则表达式匹配范围为0到9的整数。要匹配最大为99的整数,请将最大出现次数增加到2,因此正则表达式变为[0-9] {1,2}。 此正则表达式满足原始要求,以匹配从0到99的整数,但它也将匹配出现在字符串中间的整数。 如果我们希望匹配的整数是整个字符串,则必须使用锚断言^(脱字符)和 ( 美 元 ) 。 当 是 正 则 表 达 式 中 的 第 一 个 字 符 时 , 表 示 正 则 表 达 式 必 须 从 字 符 串 的 开 头 开 始 匹 配 。 当 (美元)。 当^是正则表达式中的第一个字符时,表示正则表达式必须从字符串的开头开始匹配。 当 是正则表达式的最后一个字符时,表示正则表达式必须与字符串的末尾匹配。 正则表达式变为^ [0-9] {1,2} 。 请 注 意 断 言 , 例 如 和 。 请注意断言,例如 ^和 不匹配字符,但匹配字符串中的位置。
  • 如果您看到过其他地方介绍的正则表达式,则它们看起来可能与此处所示的不同。 这是因为某些字符集和一些量词太常见了,以致于给它们指定了特殊的符号来表示它们。 [0-9]可以用符号\ d代替。 精确匹配一次出现的量词{1,1}可以用表达式本身替换,即x {1,1}与x相同。 因此,我们0到99的匹配器可以写成^ \ d {1,2} $。 也可以写成^ \ d \ d {0,1} , 即 从 字 符 串 的 开 头 开 始 , 匹 配 一 个 数 字 , 紧 接 着 是 0 或 1 个 数 字 。 实 际 上 , 它 将 写 为   d   d ? ,即从字符串的开头开始,匹配一个数字,紧接着是0或1个数字。 实际上,它将写为^ \ d \ d? 01 d d。 ? 是量词{0,1}的简写,即出现0或1。? 使表达式为可选。 regexp ^ \ d \ d?$的意思是从字符串的开头开始,匹配一位数字,然后立即匹配0或1个数字,然后立即匹配字符串的结尾。
  • To write a regexp that matches one of the words ‘mail’ or ‘letter’ or ‘correspondence’ but does not match words that contain these words, e.g., ‘email’, ‘mailman’, ‘mailer’, and ‘letterbox’, start with a regexp that matches ‘mail’. Expressed fully, the regexp is m{1,1}a{1,1}i{1,1}l{1,1}, but because a character expression is automatically quantified by {1,1}, we can simplify the regexp to mail, i.e., an ‘m’ followed by an ‘a’ followed by an ‘i’ followed by an ‘l’. Now we can use the vertical bar |, which means or, to include the other two words, so our regexp for matching any of the three words becomes mail|letter|correspondence. Match ‘mail’ or ‘letter’ or ‘correspondence’. While this regexp will match one of the three words we want to match, it will also match words we don’t want to match, e.g., ‘email’. To prevent the regexp from matching unwanted words, we must tell it to begin and end the match at word boundaries. First we enclose our regexp in parentheses, (mail|letter|correspondence). Parentheses group expressions together, and they identify a part of the regexp that we wish to capture. Enclosing the expression in parentheses allows us to use it as a component in more complex regexps. It also allows us to examine which of the three words was actually matched. To force the match to begin and end on word boundaries, we enclose the regexp in \b word boundary assertions: \b(mail|letter|correspondence)\b. Now the regexp means: Match a word boundary, followed by the regexp in parentheses, followed by a word boundary. The \b assertion matches a position in the regexp, not a character. A word boundary is any non-word character, e.g., a space, newline, or the beginning or ending of a string.

2 规则

3 使用示例

3.1 常规命名

// 4-20 size, composed of a-z, A-Z, 0-9, _, the first is a-z, A-Z
QString pattern = "^[A-Za-z][\\w]{3,19}$";
QRegExp rx(pattern);
if (rx.exactMatch(name))
    return "ok";
else
    return "error";

3.2 ipv4地址

QString pattern = "^[A-Za-z][\\w]{3,19}$";

iPv4的ip地址格式如下

(1~255).(0~255).(0~255).(0~255)

正则如下

示例1:
"^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\."
+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\."
+"(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$"
可简化
"^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])"
+"(\\.(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)){3}$";
示例2(已测):
QRegExp rx("((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)");

解释如下

\d表示0~9的任何一个数字
{2}表示正好出现两次
[0-4]表示0~4的任何一个数字
| 的意思是或者
( )上面的括号不能少,是为了提取匹配的字符串,表达式中有几个()就表示有几个相应的匹配字符串
1\\d{2}的意思就是100~199之间的任意一个数字
2[0-4]\\d的意思是200~249之间的任意一个数字
25[0-5]的意思是250~255之间的任意一个数字
[1-9]\\d的意思是10~99之间的任意一个数字
[1-9])的意思是1~9之间的任意一个数字
\\.的意思是.点要转义(特殊字符类似,@都要加\\转义)

3.3 port

QRegExp rx("^([0-9]|[1-9]\\d|[1-9]\\d{2}|[1-9]\\d{3}|[1-5]\\d{4}|6[0-4]\\d{3}|65[0-4]\\d{2}|655[0-2]\\d|6553[0-5])$");

3.4 Mac

QRegExp rx("([0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2})");

3.5 16进制

QRegExp rx("^[0-9a-fA-F]+$");
量词:
+ (出现1此或者更多次)
?(出现0次 或者 1 次)
* (出现0次 或者 更多次) 
{i,j} (出现至少i次 但是不超过j次)
锚点字符:  (确定尝试进行匹配操作的边界)
脱字符(^)   如果是正则表达式中的第一个字符,则说明匹配过程从字符串的开头处开始,
美元符($)  如果是正则表达式中最后一个字符,则表明匹配过程直到字符串的结尾才会结束;
单词边界 \b      非单词边界\B

参考

1、QRegExp 正则表达式详解
2、QRegExp
3、Qt 5.12
4、QT正则表达式—针对IP地址
5、正则表达式验证IP和端口格式的正确性
6、正则表达式验证Ip地址(绝对正确)
7、Qt中ip,mac,port的正则表达式
8、好–最全常用正则表达式大全
9、QT 正则表达式(进阶篇)IP,端口号,文件名,非空格字符的匹配,已验证

©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页