搬磚頭

          Knocking on Heaven's Door
          posts - 34, comments - 6, trackbacks - 0, articles - 0

          Ruby正則表達(dá)式

          Posted on 2007-09-18 16:10 生活在別處 閱讀(1124) 評(píng)論(0)  編輯  收藏 所屬分類: Ruby

           

          Ruby中常會(huì)用到正則表達(dá)式。正則表達(dá)式是用來表達(dá)字符串的模式(pattern)的。也可以這么理解:我們使用正則表達(dá)式來表示某種搜索規(guī)則,然后使用該正則表達(dá)式來完成字符串的搜索工作。舉個(gè)例子,假定有這樣的搜索規(guī)則:“字符串以’FOO’開始,以’R’結(jié)束”,那么就可以使用以下正則表達(dá)式來表示該規(guī)則。

          /^FOO.*R$/

          Ruby用//將正則表達(dá)式括起來。^表示開頭,$表示結(jié)尾,.*表示0個(gè)以上的任意字符。

          現(xiàn)在就講講正則表達(dá)式的規(guī)則的寫法。正則表達(dá)式中有很多上述的具有特別意義的字符。首先是下列字符。
          [ ]
          范圍描述符。[a-z]表示從a到z之間的任意一個(gè)。
          \w
          英文字母和數(shù)字。即[0-9 A-Z a-z]。
          \W
          非英文字母和數(shù)字
          \s
          空字符,即[\t\n\r\f]。
          \S
          非空字符。
          \d
          數(shù)字,即[0-9]。
          \D
          非數(shù)字。
          \b
          詞邊界字符(在范圍描述符外部時(shí))
          \B
          非詞邊界字符
          \b
          退格符(0x08)(在范圍描述符內(nèi)部時(shí))
          *
          前面元素出現(xiàn)0次以上
          +
          前面元素出現(xiàn)1次以上
          {m,n}
          前面元素最少出現(xiàn)m次,最多出現(xiàn)n次
          ?
          前面元素出現(xiàn)0次或1次
          |
          選擇
          ( )
          群組
          其他字符
          該字符本身

          例如,“^f[a-z]+”表示“第一個(gè)字符是f,后面是若干個(gè)從a到z之間的字符”,可以是“fobar”或“fool”等等。這種表達(dá)法就是正則表達(dá)式(regular expression)。在搜索字符串時(shí)正則表達(dá)式非常有用,因此在UNIX的世界里,正則表達(dá)式得到了廣泛的應(yīng)用。grep程序就是個(gè)代表。許多人是不是經(jīng)常會(huì)用到它呢?

          為了學(xué)會(huì)使用正則表達(dá)式,先來試試下面這個(gè)程序。請(qǐng)用文件名regx.rb將程序保存下來以后再運(yùn)行它。

          st = "\033[7m"
          en = "\033[m"
           
          while TRUE
             print "str> "
             STDOUT.flush
             str = gets
             break if not str
             str.chop!
             print "pat> "
             STDOUT.flush
             re = gets
             break if not re
             re.chop!
             str.gsub! /#{re}/, "#{st}\\&#{en}"
             print str, "\n"
          end
          print "\n"

          該程序會(huì)在第一次輸入的字符串中按照第二次輸入的正則表達(dá)式的要求尋找合適的字符串,并將其以反色顯示出來。下面是運(yùn)行結(jié)果。

          str> foobar
          pat> ^fo+
          foobar
          ^^^

          # 實(shí)際上foo的部分被反色顯示了。

          再試一試。

          str> abc012dbcd555
          pat> \\d
          abc012dbcd555
             ~~~    ~~~

          從上例可以看出,該程序可以檢測(cè)出多處符合條件的字符串。

          str> foozboozer
          pat> f.*z
          foozboozer
          ~~~~~~~~

          在這個(gè)例子中,正則表達(dá)式“f.*z”并非只是對(duì)應(yīng)到fooz,而是一直對(duì)應(yīng)到foozbooz這里。這是因?yàn)椋齽t表達(dá)式總是在符合條件的結(jié)果中選擇較長(zhǎng)的一個(gè)。

          正則表達(dá)式甚至可以寫出讓人一眼看不透的模式,這可能會(huì)像謎語一樣有趣。但若過分凝煉的話,以后就很難搞懂當(dāng)初的想法了。

          str> Wed Feb  7 08:58:04 JST 1996
          pat> [0-9]+:[0-9]+(:[0-9]+)?
          Wed Feb  7 08:58:04 JST 1996
                     ~~~~~~~~

          Ruby用’/’將正則表達(dá)式括起來。另外還有一些方法會(huì)自動(dòng)將字符串變?yōu)檎齽t表達(dá)式。

          % ruby -le 'print "abcdef" =~ /d/'
          3
          % ruby -le 'print "aaaaaa" =~ /d/'
          nil

          ‘=~’是使用正則表達(dá)式進(jìn)行匹配的操作符,它返回匹配成功時(shí)的位置。

          到底哪些方法可以處理正則表達(dá)式呢?關(guān)于這個(gè)問題,請(qǐng)查閱參考手冊(cè)。 


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 台中市| 巍山| 延安市| 昭通市| 常山县| 札达县| 托克逊县| 平顺县| 邢台市| 泾川县| 县级市| 荔浦县| 兴城市| 青海省| 铜梁县| 清苑县| 西林县| 灵寿县| 资兴市| 静乐县| 永兴县| 金昌市| 河津市| 嵊州市| 西宁市| 达拉特旗| 闽清县| 东方市| 岳普湖县| 拜泉县| 南澳县| 楚雄市| 天津市| 新竹市| 青河县| 西充县| 江津市| 三亚市| 法库县| 印江| 合水县|