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.pswp.cn/news/372824.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372824.shtml
英文地址,請注明出處:http://en.pswp.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…