a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > Ruby > 正文

ruby 正則表達(dá)式 教程

2020-02-24 15:41:51
字體:
供稿:網(wǎng)友
我們?cè)倏匆粋€(gè)更有趣的程序.這次我們來測(cè)試一個(gè)字符串是否和一個(gè)由簡(jiǎn)明模式(concise?pattern)編碼產(chǎn)生的描述相匹配.

在這些模式(pattern)里,一些字符或字符組合都有獨(dú)特的意義,包括:?


[]??范圍描述符?(比如,[a?-?z]?表示在a?到?z?范圍內(nèi)的一個(gè)字母)???

/w??字母或數(shù)字;相當(dāng)于?[0-9A-Za-z]??

/W??非字母,數(shù)字??

/s??[?/t/n/r/f]空字符;相當(dāng)于?[?/t/n/r/f]??

/S??非空字符??

/d??[0-9]數(shù)字;相當(dāng)于?[0-9]??

/D??非數(shù)字字符??

/b??退格符?(0x08)?(僅在范圍描述符內(nèi)部時(shí))??

/b??字邊界(word?boundary)?(在范圍描述符外部時(shí))??

/B??非字邊界??

*??前面元素出現(xiàn)0或多次??

+??前面元素出現(xiàn)1或多次??

{m,n}??前面元素最少出現(xiàn)m次,最多出現(xiàn)n次??

???前面元素最多出現(xiàn)1次;相當(dāng)于?{0,1}??

|??與前面或后面的表達(dá)式匹配??

()??群(?grouping)???


那些模式中共同使用的古怪詞匯叫做正則表達(dá)式.就象Perl一樣,Ruby也用前斜杠(而不是雙引號(hào))將它們括起來.如果你以前從未使用過正則表達(dá)式,也許它們看起來除了規(guī)則(regular)什么都不是,但花上一點(diǎn)兒時(shí)間了解它們是明智的.當(dāng)你需要對(duì)字符串進(jìn)行模式匹配,查找或其它操作時(shí),它的高效的表達(dá)能力能治好你的頭痛(并節(jié)約很多行代碼).

舉個(gè)例子,設(shè)想我們想要測(cè)試一個(gè)字符串是否符合這樣的描述信息"由小寫f開頭,跟一個(gè)大寫字母,并可能跟許多非小寫字母在后面."如果你是一個(gè)老練的C程序員,大概你的頭腦里已經(jīng)裝滿幾十行程序了,對(duì)不對(duì)?承認(rèn)吧,你難以控制住自己.在Ruby里,你只需要將你的字符串用正則表達(dá)式/^f[A-Z](^[a-z])*$/檢驗(yàn)一下就可以了.

那"一個(gè)由括起來的16位數(shù)呢"?沒問題.


ruby>?def?chab(s)???#?"contains?hex?in?angle?brackets"?
????|????(s?=~?//)?!=?nil?
????|?end?
??nil?
ruby>?chab?"Not?this?one."?
??false?
ruby>?chab?"Maybe?this??{0x35}"????#?wrong?kind?of?brackets?
??false?
ruby>?chab?"Or?this??"????#?bogus?hex?digit?
??false?
ruby>?chab?"Okay,?this:?."?
??true???


雖然,初看起來正則表達(dá)式挺讓人頭痛的,但你很快會(huì)因能夠如此高效地表達(dá)出你心中的意思而感到滿足.

下面是一個(gè)可以幫助你實(shí)驗(yàn)正則表達(dá)式的小程序,把它存為regx.rb,然后在命令行里輸入'ruby?regx.rb'運(yùn)行.


#?Requires?an?ANSI?terminal!?
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"???


這個(gè)小程序要求輸入兩次,一次字符串,一次正則表達(dá)式.輸入的字符串由正則表達(dá)式檢驗(yàn),然后用反視高亮度顯示所有匹配部分.先別管細(xì)節(jié),等會(huì)兒就有代碼分析.


str>?foobar?
pat>?^fo+?
foobar?
~~~???

上面紅色部分將在程序輸入中以反視表示出.下面的"~~~"行是為了方便那些使用基于字符瀏覽器的人.

我們?cè)僭噹讉€(gè)輸入:

str>?abc012dbcd555
pat>?/d
abc012dbcd555?


如果讓你感到驚訝,看看本頁開頭部分的那個(gè)表格:?/d與字母d無關(guān),而是對(duì)應(yīng)于單個(gè)數(shù)字.

如果有不止一種方法能匹配模式會(huì)怎樣呢?

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


之所以foozbooz被匹配而不只是fooz,是因?yàn)橐粋€(gè)正則表達(dá)符盡可能匹配最長(zhǎng)的子串.

下面是一個(gè)將冒號(hào)分隔的數(shù)字時(shí)間段從字符串中隔離出來的模式匹配.

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


"=~"是一個(gè)用于匹配正則表達(dá)式的匹配(matching)運(yùn)算符;它會(huì)返回在字符串里找到的匹配的位置,或者返回?nil?表示模式無法匹配.

ruby>?"abcdef"?=~?/d/
???3
ruby>?"aaaaaa"?=~?/d/
???nil??
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 色综合天天 | 日韩欧美一区二区三区免费观看 | 国产一二三在线 | 久久aⅴ乱码一区二区三区 午夜在线播放 | 久久久久久国产精品免费免费 | 国产精品成人免费一区二区视频 | 成人精品视频99在线观看免费 | 精品国产欧美一区二区 | 成av人在线| 美女吊逼| 另类五月天| 久久亚洲国产视频 | 女性隐私网站视频 | 成人在线视频播放 | 精品亚洲一区二区三区 | 日本一区二区在线 | 蜜桃视频成人m3u8 | 欧美a免费| 精品久久在线 | 午夜看片| www.日韩视频 | 久久久久99999| 操久久| 中文在线视频 | 亚洲免费观看视频 | 欧美日韩在线精品 | 亚洲午夜精品一区二区三区 | 久久草在线视频 | a级毛片视频免费观看 | 精品人人 | 亚洲精品久久久一区二区三区 | 国产中文在线 | 日韩专区中文字幕 | 五月激情婷婷六月 | 欧美精品久久 | wwwxxxx日本 | 久久1区| 久久久123 | 欧美在线观看网站 | 天天久久 | av中文字幕网 |