有些字符串排列上有一定的規(guī)律砖织,就好比如qq郵箱總以@qq.com結尾绘迁,手機號總是11位數(shù)字闷盔,時分秒的特定排列XX:XX:XX(第一個是00到23,第二第三個是00到59)所以我們可以對這樣一類的字符串總結出一定的規(guī)律始花,并把這種規(guī)律用在判斷下一個字符串是否符合這一規(guī)則消约。
正則表達式就是描述這么一個規(guī)律的表達式,它可以規(guī)定哪幾位是大寫小寫字母氢伟,哪幾位是數(shù)字榜轿、標點幽歼、下劃線甚至是任意多個字符單詞空白字符...
首先來看看正則表達式中的“語法”
代碼 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?說明
. ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?匹配除換行符以外的任意字符
\w ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 匹配字母或數(shù)字或下劃線
\s ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?匹配任意的空白符
\d ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?匹配數(shù)字
\b ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?匹配單詞的開始或結束
^ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?匹配字符串的開始
$ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?匹配字符串的結束
\ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?轉義字符
比如說我想匹配一個11位數(shù)的手機號,它的特點就是有11位數(shù)字谬盐,我就可以這樣寫
^\d\d\d\d\d\d\d\d\d\d\d$
連續(xù)寫11個\d好麻煩甸私,那么久這樣寫
^\d{11}$
又或者想要匹配135開頭的手機號,那就這樣
^135\d{8}$
想要匹配^.\$之類的就要在前面添加轉義字符\飞傀,這和C++一樣皇型。
有時候我不知道某個字符出現(xiàn)多少次怎么辦
代碼/語法 ? ? ? ? ? ? ? 說明
* ? ? ? ? ? ? ? ? ? ? ? ? ? ?重復零次或更多次
+ ? ? ? ? ? ? ? ? ? ? ? ? ? 重復一次或更多次
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?重復零次或一次
{n} ? ? ? ? ? ? ? ? ? ? ? ? ?重復n次
{n,} ? ? ? ? ? ? ? ? ? ? ? ? 重復n次或更多次
{n,m} ? ? ? ? ? ? ? ? ? ? ?重復n到m次
這樣\w+就代表至少有一個字母或數(shù)字或下劃線或漢字
其他同理。
如果我知道第一個是數(shù)字而且他的大小限定在[ 0,5 ],如果用\d匹配顯然不對砸烦,那么就可以利用范圍[0,5]來匹配
由此可知[0,9]與\d等價弃鸦,[a-z0-9A-Z_]也完全等同于\w(如果只考慮英文的話)。
如果我知道第一個是數(shù)字且只能是0或者1外冀,那怎么辦呢寡键∠朴荆可以這樣
[01]?
表示0和1只出現(xiàn)其一雪隧。
知道了這些,回到我們的作業(yè)2员舵,這樣子的話脑沿,匹配起來就不需要那么麻煩一個個嘗試了÷砥В可以使用以下語法
^[A-Z]\\d{3};.+;\\w+\\s\\w+;[12]?\\d{3};\\d+$
來分析一下庄拇,第一個[A-Z]代表首字母是大寫字母,\d{3}代表3個數(shù)字韭邓,
為什么要兩個\\呢措近,別忘了在c++中\(zhòng)也是轉義字符,要想使用\d,就必須\\d,
然后是;
然后是.+代表至少有一個是除換行符以外的字符
然后是;
然后是至少一個字母數(shù)字下劃線
然后是空格
然后是至少一個字母數(shù)字下劃線
然后是;
然后是一個數(shù)字女淑,這個數(shù)字只能是1或者2
然后是3個數(shù)字
然后是;
然后是一個或以上個數(shù)字
正則表達式寫好了瞭郑,怎么用呢
包含庫regex
string XXX;
...
//讀取XXX
regex str("^[A-Z]\\d{3};.+;\\w+\\s\\w+;[12]?\\d{3};\\d+$");//匹配規(guī)則
bool flag=regex_match(XXX, str);//返回bool類型,1表示匹配鸭你,0表示不匹配
...
<-----------------------分割線--------------------------------->
剛開始看到這種匹配的時候
第一個想到的是scanf加分號的屈张,
然后想到的是strtok,
然后是c++的getline
最后才是正則表達式袱巨,而正則表達式也是因為需要才剛學的阁谆。
想了解更多的戳這里http://www.jb51.net/tools/zhengze.html
判斷符合標準之后的截取字符串可以參考這里http://www.jb51.net/article/37410.htm
有的編譯器如Dev和code::block不支持regex庫,會提示
#error This file requires compiler and library support for the \
ISO C++ 2011 standard. This support is currently experimental, and must be \
enabled with the -std=c++11 or -std=gnu++11 compiler options.
不過我在vs2010上測試過愉老,可以通過场绿。
<*********************************************************>