qregexp括号匹配_转:Qt的正则表达式和QRegExp

考虑一下我们经常遇到的问题,比如gemfield想从青岛之光读书(www.civilnet.cn/book)中找一个关键的电话号码,通常第一步就是将书中所有的电话号码查找出来放在手边。那么怎么拟定查询条件呢?电话的格式有如下几种:

01088888888

010 88888888

010-88888888

88888888

0532-88888888

0534-8888888

88888888beijing

qingdao88888888

…………

省略号的意思是格式的种类有很多种,但也有更多种明显就不是电话类型。这种情况下如何拟定我们的查询条件呢。如果面面俱到的话,代码中得多少次if或者switch分支呢。

Gemfield此刻是多么的希望有一个语句能够简单的描述上述所有可能的格式。这或许就是正则表达式的来历。正则表达式的英文原意是:Regular Expression。Regular Expression的“Regular”一般被译为“正则”、“正规”、“常规”。此处的“Regular”即是“规则”、“规律”的意思,Regular Expression即“描述某种规则的表达式”之意。

来看看gemfield如何一步步实现这个想法。

我们可以用

ddd-dddddddd或者ddddddddwwwwwww

来分别描述类似于010-88888888和88888888beijing这样的例子。

这里,d表示所有可能出现的数字:0、1、2、3、4…… 9;w表示所有可能出现的字母:a、b、c、d……z。

但有时我们在这个位置上明确的限定就是’w’这个字母,而非代表所有字母的w,那怎么办呢?上面的举例肯定会带来混淆。我们借助反斜杠/来实现:

/d/d/d-/d/d/d/d/d/d/d/d或者/d/d/d/d/d/d/d/d/w/w/w/w/w/w/w

这样就能区分w到底是代表所有字母,还是仅仅代表w本身这个字母。不过看起来就有点丑陋了,这么长,输错或者看错的个数怎么办?gemfield可以使用下面的写法来使其变得简洁:

/d3-/d8或者/d8/w7

但问题又来了,我们这里出现的3是表示前面的数字出现3次,而非3本身,后面的8、7等数字同理。怎么办呢?gemfield可以这样写:

/d{3}-/d{8}或者/d{8}/w{7}

这里{}的意义和反斜杠/差不多。都是明确告诉你,w不是w,3不是3。:-D

但很明显,有的电话号是不加区号的,比如010-88888888写作88888888。这样,就不是/d{3}-/d{8}了,而是/d{8}。或许你可以写作:

/d{8}或者/d{3}-/d{8}

但“或者”不可能成为程序语言中的关键字的,没有编译器会认识他。怎么办?我们想到了程序中有个运算符意思和“或者”相似,它就是| 。gemfield可以写作:

/d{8} | /d{3}-/d{8}

但怎么看怎么都像少个东西,看起来混在一起分辨不清。我们想到了圆括号:

(/d{8})|(/d{3}-/d{8})

用圆括号括起来就表示一个整体了,这里的意思就是说,有2组模式,其中的哪一种都可以。传统上,?这个符号(问号)可以用来表示某项是可选的。这样的话,上面的表达式可以写作:

(/d{3}-)?(/d{8})

这样就表示前面的那一组(/d{3}-)是可选的,也即既可以有,也可以不要,这刚好表达了gemfield的本意。由于还有010 88888888这种形式,我们还要考虑空格的可选,对于空格,我们可以用/s来表示。表达式修正如下:

(/d{3})?(-)?/s?(/d{8})

但是电话号码010 88888888中间的空格在输入的时候也许多输了一个,比如

10 88888888,那怎么办呢?我们用*来表示0个、1个、2个或者多个。修正如下:

(/d{3})?(-)?/s*(/d{8})

但是,似乎好像电话不都像北京一样,有8个数字(除了区号),大多数中国城市还是7个呢。所以这个数量也必须是可选的。我们可以扩展一下:

(/d{3})?(-)?/s*(/d{7,8})

这样就表示电话号码是7个或者8个,也就是大于等于7,小于等于8。

好了,虽然上面的演化对于严谨的语法来说没有什么意义,但有了这个思路,就可以认识我们的QregExp了,欢迎来到Qt的正则表达式——QregExp。

****************************************************

正则表达式由语句、数量、界定符三者组成。

语句是最简单的,由[]括起来一个完整的子语句。如[ABCD] 匹配字母A或B或C或D,而[A-Z]表示26个大写的英文字母。

A{1,26}匹配1个、2个、3个……26个字母A;

[0-9]{1,2}匹配0~99,但同时也匹配ab34、a34b等;

^[0-9]{1,2},匹配34bc、26abcd,只要数字前面别有其他东西;

[0-9]{1,2}$ 匹配ab65、aaaaa56,只要数字后面别有其他东西;

^[0-9]{1,2}$ 只能是2位数字了。

但是^一旦出现在方括号中就不一样了。它表示“不包含”。

例如:[^abc]匹配所有的东西,除了a或b或c。

+表示至少出现一次,如([abc]+)表示a或者b或者c至少出现一次。

至于*、?等界定符的意思,和gemfield文中初始部分的推理是一个意思。

******************************************************

而QregExp这个类是怎样使用这些regexp呢,gemfield总结大致有2种情况,这两种情况刚好是事物的两面。第一种是“检索”类的。看个例子:

******************************************************

str = "CIVILNET Corporation/tcivilnet.cn/tGELE";

QString company, web, country;

rx.setPattern("^([^/t]+)/t([^/t]+)/t([^/t]+)$");

if (rx.indexIn(str) != -1) {

company = rx.cap(1);

web = rx.cap(2);

country = rx.cap(3);

}

******************************************************

正如上面这个代码片段所揭示的,indexIn和cap这两个函数是比较常用的,至于具体的含义,可以阅读Qt在线文档:http://www.civilnet.cn/book/embedded/GUI/Qt_assistant/index.php

第二种是“禁止”类的,比如一个QlineEdit里禁止输入一些东西,比如邮箱名禁止输入&等。这个是用QRegExpValidator 来实现的,该类接收一个QregExp型的正则表达式作为实例化时的参数:

**********************************************************

QRegExp rx("-?//d{1,3}");

QValidator *validator = new QRegExpValidator(rx, this);

QLineEdit *edit = new QLineEdit(this);

edit->setValidator(validator);

************************************************************

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2011-06-20 14:01

浏览 825

评论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

具有Tron效果的JavaFX 2 Form

这是一个具有TRON效果的简单JavaFX登录表单。 在此示例中,我使用CSS设置TextField和Button的样式。 这是CSS和Effect代码的片段: .text-field{-fx-background-color: transparent;-fx-border-color: #00CCFF;-fx-text-fill: white; }.password-field{-fx…

Spring注解Annotion详解

概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名、类型等信息,如果关系表字段和 PO…

CopyOnWrite容器

1.简介 1.CopyOnWrite是程序优化的策略,当共享的内容需要修改时,复制出去一份进行修改,然后将原来的引用指向修改完的 2.java并发包(java.util.concurrent)中CopyOnWriteArrayList和CopyOnWriteArraySet实现了这个并发容器 3.好处:因为写时是在复制的一份上操作,所以可以并发的…

Akka的字数统计MapReduce

在我与Akka的日常工作中,我最近写了一个字数映射表简化示例。 本示例实现了Map Reduce模型,该模型非常适合横向扩展设计方法。 流 客户端系统(FileReadActor)读取文本文件,并将每一行文本作为消息发送给ClientActor。…

mysql如何设置多节点_详细介绍Mysql5.7从节点设置多线程主从复制的办法

软件安装:装机软件必备包SQL是Structured Query Language(结构化查询语言)的缩写。SQL是专为数据库而建立的操作命令集,是一种功能齐全的数据库语言。在使用它时,只需要发出“做什么”的命令,“怎么做”是不用使用者考虑的。SQL功…

python学习笔记 可变参数关键字参数**kw相关学习

在Python中可以定义可变参数,顾名思义,可变参数就是传入参数是可变的。可以是任意个,以一个简单的数学编程为例,计算 sum a * a b * b .....z * z 函数定义可以如下: def getsum(num) :sum 0for n in num :sum su…

Struts2之环境配置

在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计。在这儿MVC模式的好处就不在提了。 技术优势 Struts2有两方面的技术优势,…

mysql数据库备份shell_mysql数据库备份shell脚本分享

#!/bin/bash#2020年04月27日15:56:21#auto backup mysql db#by author www.cnbugs.com########################SQL_DB"$*"SQL_USR"backup"SQL_PWD"123456"SQL_CMD"/usr/bin/mysqldump"SQL_DIR"/data/backup/date %F"if [ $…

懒惰的JSF Primefaces数据表分页–第1部分

今天,我们将使用带有视图范围的托管bean的惰性列表进行JSF数据表分页。 这些单词/表达式是什么意思? 如今,有几个JSF框架为数据表提供现成的分页,列排序器和其他功能。 今天,我们将使用Primefaces数据表。 通常&#…

java 动态增加定时任务

直接上代码 import org.apache.tools.ant.util.DateUtils; import org.quartz.CronTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory;import java.util.Calendar; import…

基于JavaFX的SimpleDateFormat演示程序

对于使用Java Date进行格式化的新手甚至对于使用Java Date进行格式化的有经验的Java开发人员而言,可能有些棘手的事情是使用SimpleDateFormat规范日期/时间格式。 SimpleDateFormat的基于类级别的Javadoc的文档非常详尽,涵盖了表示日期/时间的各个组成部…

mysql中预定义常量_PHP预定义常量

这些常量在 PHP 的内核中定义。它包含 PHP、Zend 引擎和 SAPI 模块。PHP_VERSION (string)PHP_OS (string)PHP_EOL (string)自 PHP 4.3.10 和 PHP 5.0.2 起可用PHP_INT_MAX (integer)自 PHP 4.4.0 和 PHP 5.0.5 起可用PHP_INT_SIZE (integer)自 PHP 4.4.0 和 PHP 5.0.5 起可用D…

iOS与H5交互

前提:在iOS控制器中加载UIWebView,设置代理,遵守UIWebViewDelegate协议。 一、iOS调用JS方法 通过iOS调用JS代码实现起来比较方便直接调用UIWebView的方法- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script…

cocos2dx 3.x 蒙板 遮罩 点击圆功能

//注册触摸EventListenerTouchOneByOne *listener EventListenerTouchOneByOne::create();listener->onTouchBegan CC_CALLBACK_2(HelloWorld::onTouchBegan,this);listener->onTouchMoved CC_CALLBACK_2(HelloWorld::onTouchMoved,this);listener->onTouchEnded …

markdownTest

MARKDOWNTEST 11111111111111有一种神奇的语言,它比html还简单,它巧妙地将内容与格式整合在一起——它就是Markdown有一种神奇的语言,它比html还简单,它巧妙地将内容与格式整合在一起——它就是Markdown 111111111111111222222222…

python模拟密码有效性检测功能_检查密码有效性(Django/Python)

我有一个非常小的Django应用程序,主要是为了学习。我使用的是Django提供的内置用户模型。为了学习这个功能,我创建了一些页面,这些页面允许我创建和编辑用户,而不必进入管理面板。在register页面允许我非常容易地检查密码和电子邮…

教程:Hibernate,JPA –第1部分

这是关于使用Hibernate和JPA的教程的第一部分。 这部分是对JPA和Hibernate的介绍。 第二部分将研究使用Spring ORM组合Spring MVC应用程序以减少创建CRUD应用程序所需的代码量。 为此,您需要熟悉Maven,JUnit,SQL和关系数据库。 依存关系 首…

TCP、UDP套接字的数据传输

tcp发送数据&#xff1a; 1 #include <sys/types.h> 2 #include <socket.h> 3 ssize_t send(int sockfd,const void *msg,size_t len,int flags); 函数send只能对面向连接的套接字使用。参数sockfd为已经建立好连接的套接字描述符。参数msg指向待发送数据的缓冲区&…

Windows下用PIP安装scipy出现no lapack/blas resources found

Windows下升级了pandas&#xff0c;但是发现scipy包随后引用出错&#xff0c;后来确认需重新安装scipy&#xff0c; 在用PIP安装scipy出现no lapack/blas resources found的错误&#xff0c;具体原因可参考 这里。 后来找到一种简便的解决方案&#xff0c;只要在网站 Unofficia…

Aleri –复杂事件处理

Sybase的Aleri流媒体平台是CEP市场中最受欢迎的产品之一。 它在Sybase的交易平台RAP版本中使用&#xff0c;该版本在资本市场中广泛用于管理投资组合中的头寸。 今天&#xff0c;在这个由多个部分组成的系列文章的第一个部分中&#xff0c;我希望提供Aleri平台的概述&#xff0…