Flyingis

          Talking and thinking freely !
          Flying in the world of GIS !
          隨筆 - 156, 文章 - 16, 評論 - 589, 引用 - 0

          導(dǎo)航

          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          公告

          Flyingis博客空間內(nèi)所有文章除特別聲明為[轉(zhuǎn)載],均為作者的學(xué)習(xí)心得和原創(chuàng)作品。如要轉(zhuǎn)載,請注明作者名flyingis及原文地址

          聯(lián)系方式

          常用鏈接

          留言簿(41)

          我參與的團隊

          隨筆分類

          隨筆檔案

          文章分類

          新聞檔案

          .Net 技術(shù)

          Ajax Technology

          Eclipse Technology

          ESRI Technology

          GIS Technology

          Java Technology

          Linux Technology

          Open Source

          個人博客

          精彩博客(技術(shù)類)

          精彩博客(非技術(shù))

          搜索

          •  

          積分與排名

          • 積分 - 661665
          • 排名 - 72

          最新評論

          閱讀排行榜

          評論排行榜

          正則表達式--簡單模式

          ??? 作者:Flyingis

          ??? 正則表達式除了用來匹配一些特殊字符外,還有許多其他的作用。Metacharacters,character classes和quantifiers都是正則表達式語法中的重要組成部分,可以用來實現(xiàn)更強大的功能。?

          ??? Metacharacters

          ??? 正則表達式的Metacharacters主要包括:

          ??? ([{\^$|)?*+.

          ??? 當需要使用這些符號的時候,需要在前面加上一個反斜杠"\",例如:

          var?reg?=?/\?/;
          var?reg?=?new?RegExp("\\?");

          ??? 一個字符的表示可以使用它的文字符號,也可以使用ASCII碼或Unicode碼來代碼它。例如,當一個字符使用ASCII碼表示的時候,我們需要在一個兩位十六進制的編碼前加上"\x"。

          var?name?=?"apple";
          var?regName?=?/\x61/;
          alert(regName.test(name));??
          //輸出"true"

          ??? 當然,使用十進制來表示字母a。

          var?reg?=?/\141/;

          ??? 使用Unicode來表示一個字符,需要四位十六進制的編碼,例如\u0062代表b。

          var?s?=?"big";
          var?reg?=?/\u0062/;
          alert(reg.test(s));??
          //輸出為"true"

          ??? 下面一段代碼可以到達同樣的效果:

          var?s?=?"big";
          var?reg?=?new?RegExp("\\u0062");
          alert(reg.test(s));??
          //輸出為"true"

          ??? 另外,有一些預(yù)定義好的特殊字符,用來表示特殊的含義。如:“\t,\n,\r,\f,\a,\e,\cX,\b,\v,\0”。

          //將用戶輸入的新一行的所有字符都刪除
          var?str?=?strWithNewLines.replace(/\n/g,?"");

          ??? Character classes
          ?
          ??? Character classer代表著需要匹配的一組字符,將需要匹配的字符放在一對中括號里,正則表達式將能有效的識別第一個字符,第二個字符,等等。

          ??? Simple classes

          ??? 如果需要同時匹配"pig"和"big",可以使用simple character class來實現(xiàn):

          var?str?=?"pig,?big";
          var?reg?=?/[pb]ig/gi;
          var?arr?=?str.match(reg);

          ??? 此時,arr中的數(shù)據(jù)包括"pig"和"big"。當然,使用ASCII或Unicode來表示p或b同樣可行。

          ??? Negation classes

          ??? 有時我們需要匹配除了少數(shù)幾個字符外的所有字符,在這種情況下,我們可以使用negation class來進行匹配。例如,匹配除了a和b之外所有的字符,可以表示為[^ab]。在上一個例子中,將reg表示為/[^p]ig/gi,則結(jié)果中將過濾掉pig。

          ??? Range classes

          ??? 顧名思義,range class就是用來指定某個范圍的匹配字符,例如從a到z可以表示為[a-z],從1到10可以表示為[1-10]。如果將range class指定的字符排除在外,可以使用[^1-10],表示除了1到10范圍外的所有字符。

          ??? Combination classes

          ??? 舉一個例子就清楚了,現(xiàn)在需要匹配從1到10,從a到g,并且加上新一行的所有字符,可以表示為[1-10a-g\n]。注意,在[]里不允許再嵌套[]
          ??
          ??? Predefined classes

          ??? 因為有許多樣式都不停在重復(fù)使用,因此一組預(yù)定義好的character classes可以用來簡化一些比較復(fù)雜的類型。具體的可以參考相關(guān)資料,下面舉個簡單的例子:
          ??
          var?str?=?"8743?apple";
          var?reg?=?/[0-9][0-9][0-9]/;
          alert(reg.test(str));??
          //輸出為"true"
          ??
          ??? 使用predefined class可以寫成:

          var?str?=?"8743?apple";
          var?reg?=?/\d\d\d/;
          alert(reg.test(str));??
          //輸出為"true"

          ??? Quantifiers
          ?
          ??? Quantifiers能夠指定某種匹配方式需要進行多少次,包括指定確定的次數(shù),或不確定的次數(shù)如至少多少次。

          ??? Simple quantifiers

          ??? 下面列表中,指定了某種模式需要重復(fù)進行的次數(shù),部分符號和閉包的意義一樣:

          simple quantifiers.gif

          ??? 例如var reg = /b?read/就可以表示bread或read。
          ??
          ??? 三種正則表達式的quantifiers

          ??? Greedy quantifier: 對一個目標串進行匹配搜索,當在目標串中沒有相匹配的字符串時,就刪去目標串的最后一個字符,再次進行匹配,如果沒有發(fā)現(xiàn)則再刪去最后一個字符,依此類推,最后的結(jié)果要么已經(jīng)將字符匹配上,要么目標串已經(jīng)為空。

          ??? Reluctant quantifier: 和greedy quantifier搜索風(fēng)格相反。Reluctant quantifier從目標串的第一個字符開始對目標串進行搜索,當沒有匹配時,給目標串加上一個字符,再次進行搜索,依此類推,直到在目標串上匹配成功,或整個目標串都被搜索但仍然沒有完成匹配。

          ??? Possessive quantifier: 直接對整個目標串進行匹配,要么匹配上,要么匹配失敗,它只進行一次匹配。

          ??? 那么如何判斷這三種不同的quantifiers呢?主要就是根據(jù)問號(?)星號(*)和加號(+)的組合來判斷的,如下表所示。

          three quantifiers.gif

          ??? 需要注意的是,possessive quantifier在目前主流的瀏覽器中都不被支持,IE和Opera在碰到possessive quantifier時將會拋出異常,Mozilla雖然不會發(fā)生錯誤,但會將它作為greedy quantifier來對待。


          ??? 相關(guān)鏈接:正則表達式--JavaScript 實現(xiàn)基礎(chǔ)

          posted on 2006-08-11 16:09 Flyingis 閱讀(3180) 評論(0)  編輯  收藏 所屬分類: Web 客戶端技術(shù)

          主站蜘蛛池模板: 扎囊县| 宜兰市| 峨边| 西峡县| 香格里拉县| 寻甸| 合作市| 宣恩县| 滕州市| 芦山县| 清水县| 陇南市| 井冈山市| 天等县| 江北区| 肥西县| 绥芬河市| 平谷区| 旌德县| 东台市| 阿拉尔市| 阿鲁科尔沁旗| 改则县| 五峰| 丹江口市| 永吉县| 沙雅县| 元阳县| 闸北区| 宁陕县| 千阳县| 广饶县| 白朗县| 正蓝旗| 湖南省| 横山县| 银川市| 阳原县| 武城县| 平江县| 手游|