夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
                  想必很多人都對正則表達式都頭疼。今天,我以我的認識,加上網上一些文章,希望用常人都可以理解的表達方式來和大家分享學習經驗。

            開篇,還是得說說 ^ 和 $ 他們是分別用來匹配字符串的開始和結束,以下分別舉例說明:
                  "^The": 開頭一定要有"The"字符串;
                  "of despair$": 結尾一定要有"of despair" 的字符串;
                  那么,
                  "^abc$": 就是要求以abc開頭和以abc結尾的字符串,實際上是只有abc匹配。

            "notice": 匹配包含notice的字符串。

            你可以看見如果你沒有用我們提到的兩個字符(最后一個例子),就是說 模式(正則表達式) 可以出現在被檢驗字符串的任何地方,你沒有把他鎖定到兩邊。

            接著,說說 '*', '+',和 '?',

            他們用來表示一個字符可以出現的次數或者順序. 他們分別表示:

          1.   "zero or more"相當于{0,},
          2.   "one or more"相當于{1,},
          3.   "zero or one."相當于{0,1}, 這里是一些例子:
          4.   "ab*": 和ab{0,}同義,匹配以a開頭,后面可以接0個或者N個b組成的字符串("a", "ab", "abbb", 等);
          5.   "ab+": 和ab{1,}同義,同上條一樣,但最少要有一個b存在 ("ab", "abbb", 等.);
          6.   "ab?":和ab{0,1}同義,可以沒有或者只有一個b;
          7.   "a?b+$": 匹配以一個或者0個a再加上一個以上的b結尾的字符串.

            要點, '*', '+',和 '?'只管它前面那個字符.

            你也可以在大括號里面限制字符出現的個數,比如

          1.   "ab{2}": 要求a后面一定要跟兩個b(一個也不能少)("abb");
          2.   "ab{2,}": 要求a后面一定要有兩個或者兩個以上b(如"abb", "abbbb", 等.);
          3.   "ab{3,5}": 要求a后面可以有2-5個b("abbb", "abbbb", or "abbbbb").

            現在我們把一定幾個字符放到小括號里,比如:

          1.   "a(bc)*": 匹配 a 后面跟0個或者一個"bc";
          2.   "a(bc){1,5}": 一個到5個 "bc."

            還有一個字符 '│', 相當于OR 操作:

            "hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串;

            "(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串;

            "(a│b)*c": 匹配含有這樣多個(包括0個)a或b,后面跟一個c的字符串;

            一個點('.')可以代表所有的單一字符,不包括"\n"

            如果,要匹配包括"\n"在內的所有單個字符,怎么辦?

            對了,用'[\n.]'這種模式.

            "a.[0-9]": 一個a加一個字符再加一個0到9的數字

            "^.{3}$": 三個任意字符結尾 .

            中括號括住的內容只匹配一個單一的字符

            "[ab]": 匹配單個的 a 或者 b ( 和 "a│b" 一樣);

            "[a-d]": 匹配'a' 到'd'的單個字符 (和"a│b│c│d" 還有 "[abcd]"效果一樣); 一般我們都用[a-zA-Z]來指定字符為一個大小寫英文

            "^[a-zA-Z]": 匹配以大小寫字母開頭的字符串

            "[0-9]%": 匹配含有 形如 x% 的字符串

            ",[a-zA-Z0-9]$": 匹配以逗號再加一個數字或字母結尾的字符串

            你也可以把你不想要得字符列在中括號里,你只需要在總括號里面使用'^' 作為開頭 "%[^a-zA-Z]%" 匹配含有兩個百分號里面有一個非字母的字符串.

            要點:^用在中括號開頭的時候,就表示排除括號里的字符。為了PHP能夠解釋,你必須在這些字符面前后加'',并且將一些字符轉義.

            不要忘記在中括號里面的字符是這條規路的例外?在中括號里面, 所有的特殊字符,包括(''), 都將失去他們的特殊性質 "[*\+?{}.]"匹配含有這些字符的字符串.

            還有,正如regx的手冊告訴我們: "如果列表里含有 ']', 最好把它作為列表里的第一個字符(可能跟在'^'后面). 如果含有'-', 最好把它放在最前面或者最后面, or 或者一個范圍的第二個結束點[a-d-0-9]中間的‘-’將有效.

            看了上面的例子,你對{n,m}應該理解了吧.要注意的是,n和m都不能為負整數,而且n總是小于m. 這樣,才能 最少匹配n次且最多匹配m次. 如"p{1,5}"將匹配 "pvpppppp"中的前五個p



          匹配中文字符的正則表達式: [\u4e00-\u9fa5]

          匹配雙字節字符(包括漢字在內):[^\x00-\xff]

          應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)

          String.prototype.len=function(){return this.replace([^\x00-\xff]/g,"aa").length;}

          匹配空行的正則表達式:\n[\s| ]*\r

          匹配HTML標記的正則表達式:/<(.*)>.*<\/\1>|<(.*) \/>/

          匹配首尾空格的正則表達式:(^\s*)|(\s*$)

          應用:javascript中沒有像vbscript那樣的trim函數,我們就可以利用這個表達式來實現,如下:

          String.prototype.trim = function()
          {
          return this.replace(/(^\s*)|(\s*$)/g, "");
          }

          利用正則表達式分解和轉換IP地址:

          下面是利用正則表達式匹配IP地址,并將IP地址轉換成對應數值的Javascript程序:

          function IP2V(ip)
          {
          re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正則表達式
          if(re.test(ip))
          {
          return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
          }
          else
          {
          throw new Error("Not a valid IP address!")
          }
          }

          不過上面的程序如果不用正則表達式,而直接用split函數來分解可能更簡單,程序如下:

          var ip="10.100.20.168"
          ip=ip.split(".")
          alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

          匹配Email地址的正則表達式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

          匹配網址URL的正則表達式:http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

          利用正則表達式去除字串中重復的字符的算法程序:[注:此程序不正確,原因見本貼回復]

          var s="abacabefgeeii"
          var s1=s.replace(/(.).*\1/g,"$1")
          var re=new RegExp("["+s1+"]","g")
          var s2=s.replace(re,"")
          alert(s1+s2) //結果為:abcefgi

          我原來在CSDN上發貼尋求一個表達式來實現去除重復字符的方法,最終沒有找到,這是我能想到的最簡單的實現方法。思路是使用后向引用取出包括重復的字符,再以重復的字符建立第二個表達式,取到不重復的字符,兩者串連。這個方法對于字符順序有要求的字符串可能不適用。

          得用正則表達式從URL地址中提取文件名的javascript程序,如下結果為page1

          s="http://www.9499.net/page1.htm"
          s=s.replace(/(.*\/){0,}([^\.]+).*/ig,"$2")
          alert(s)

          利用正則表達式限制網頁表單里的文本框輸入內容:

          用正則表達式限制只能輸入中文:onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

          用正則表達式限制只能輸入全角字符: onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')" onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

          用正則表達式限制只能輸入數字:onkeyup="value=value.replace(/[^\d]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

          用正則表達式限制只能輸入數字和英文:onkeyup="value=value.replace(/[\W]/g,'') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

          posted on 2007-11-07 11:23 HUIKK 閱讀(332) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 安乡县| 镇坪县| 姚安县| 综艺| 女性| 濮阳县| 隆德县| 云和县| 兰溪市| 扬州市| 甘南县| 夏邑县| 松江区| 会同县| 丁青县| 瑞昌市| 原阳县| 教育| 板桥市| 普格县| 漳浦县| 云林县| 连州市| 佛教| 柳河县| 龙山县| 织金县| 河津市| 连州市| 普兰县| 阿合奇县| 武穴市| 武威市| 松溪县| 安丘市| 株洲市| 凤凰县| 新丰县| 东莞市| 咸宁市| 莱阳市|