夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
                  想必很多人都對正則表達(dá)式都頭疼。今天,我以我的認(rèn)識,加上網(wǎng)上一些文章,希望用常人都可以理解的表達(dá)方式來和大家分享學(xué)習(xí)經(jīng)驗。

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

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

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

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

            他們用來表示一個字符可以出現(xiàn)的次數(shù)或者順序. 他們分別表示:

          1.   "zero or more"相當(dāng)于{0,},
          2.   "one or more"相當(dāng)于{1,},
          3.   "zero or one."相當(dāng)于{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結(jié)尾的字符串.

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

            你也可以在大括號里面限制字符出現(xiàn)的個數(shù),比如

          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").

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

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

            還有一個字符 '│', 相當(dāng)于OR 操作:

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

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

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

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

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

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

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

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

            中括號括住的內(nèi)容只匹配一個單一的字符

            "[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]$": 匹配以逗號再加一個數(shù)字或字母結(jié)尾的字符串

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

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

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

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

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



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

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

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

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

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

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

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

          應(yīng)用:javascript中沒有像vbscript那樣的trim函數(shù),我們就可以利用這個表達(dá)式來實現(xiàn),如下:

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

          利用正則表達(dá)式分解和轉(zhuǎn)換IP地址:

          下面是利用正則表達(dá)式匹配IP地址,并將IP地址轉(zhuǎn)換成對應(yīng)數(shù)值的Javascript程序:

          function IP2V(ip)
          {
          re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //匹配IP地址的正則表達(dá)式
          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!")
          }
          }

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

          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地址的正則表達(dá)式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

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

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

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

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

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

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

          利用正則表達(dá)式限制網(wǎng)頁表單里的文本框輸入內(nèi)容:

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

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

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

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

          posted on 2007-11-07 11:23 HUIKK 閱讀(333) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 定远县| 伊通| 万全县| 大港区| 静宁县| 天祝| 海丰县| 堆龙德庆县| 新竹市| 睢宁县| 屯门区| 沁源县| 武陟县| 大田县| 西峡县| 富阳市| 湛江市| 宁都县| 沙河市| 宁国市| 临漳县| 罗定市| 莆田市| 城固县| 郴州市| 滁州市| 涞水县| 仲巴县| 冕宁县| 来安县| 得荣县| 新巴尔虎右旗| 鸡东县| 九寨沟县| 如皋市| 昭平县| 龙门县| 辰溪县| 永胜县| 夏河县| 科技|