ruby匹配中文的正則表達

2021-09-01 18:51:35 字數 2941 閱讀 7188

ruby1.9:

ruby1.8 針對各種編碼的正則:

一般規則(為正常顯示,都放在**塊內)

/a/匹配字元a。    

/\?/匹配特殊字元?。特殊字元包括^, $, ? , ., /, \, [, ], , (, ), +, *.

.匹配任意字元,例如/a./匹配ab和ac。

/[ab]c/匹配ac和bc,之間代表範圍。例如:/[a-z]/ , /[a-za-z0-9]/。

/[^a-za-z0-9]/匹配不在該範圍內的字串。

/[\d]/代表任意數字

/[\w]/代表任意字母,數字或者_

/[\s]/代表空白字元,包括空格,tab和換行。

/[\d]/,/[\w]/,/[\s]/均為上述的否定情況。

高階規則

?代表0或1個字元。/mrs?\.?/匹配"mr","mrs","mr.","mrs."。 

*代表0或多個字元。/hello*/匹配"hello","hellojack"。

+代表1或多個字元。/a+c/匹配:"abc","abbdrec"等等。

/d/匹配3個數字。

/d/匹配1-10個數字。

/d/匹配3個數字以上。

/([a-z]\d)/匹配首位是大寫字母,後面4個是數字的字串。

正規表示式操作

string和regexp均支援=~match兩個查詢匹配方法:

puts "i can say my name" =~ /name/ #-> 13

a = /name/.match("i can say my name, my name i can say") #-> a is matchdata

puts a[0] #-> name

可以看出,如果能夠匹配,=~返回匹配的字串位置,而match返回乙個matchdata物件。如果不匹配,則返回nil。matchdata可以取出其中符合各個子匹配(或子模式)的內容,看下面的例子:

b1=/[a-za-z]+,[a-za-z]+,mrs?\./.match("jack,wang,mrs., nice person")

puts b1[0] #-> jack,wang,mrs

b2=/(([a-za-z]+),([a-za-z]+)),mrs?\./.match("jack,wang,mrs., nice person:)

puts b2[0] #-> jack,wang,mrs

puts b2[1] #-> jack,wang

puts b2[2] #-> jack

puts b2[3] #-> wang

m[0]返回匹配匹配主表示式的字串,下面的方法是等同的:m[n]==m.captures[n]

ruby也自動的為我們填寫一些全域性變數,它們以數字做名,$1, $2, 等等,$1包含的是正規表示式中從左側開始的第一對小括號內的子模式所匹配的字串,以此類推。我們看出匹配時,是從外到內,從左到右的順序。

貪婪量詞和不貪婪量詞

量詞*(表示零個或多個)+(表示乙個或多個)貪婪的,它們會匹配盡可能多的字元,我們可以在*和+後面加乙個?,使它成為非貪婪量詞

下面**是: 1個或多個字元後接乙個感嘆號。

teststr="abcd!efg!"

match=/.+!/.match(teststr)

puts match[0] #-> abcd!efg!

limitmatch=/.+?!/.match(teststr)

puts limitmatch[0] #-> abcd!

錨是指必須滿座一定的條件,才能繼續匹配:

^     行首

$ 行尾

\a 字串的開始

\z 字串的結尾

\z 字串的結尾(不包括最後的換行符)

\b 單詞邊界

c=/\b\w+\b/.match("!!stephen**")

puts c[0] #-> stephen

前視斷言

前視斷言表示想要知道下乙個指定的是什麼,但並不匹配

假設我們想要匹配乙個數的序列,該序列以乙個圓點結束,但並不想把圓點作為模式匹配的一部分

teststr="123 456 789. 012"

m=/\d+(?=\.)/.match(teststr)

puts m[0] #-> 789

上例,如果/\d+(?=\.)/改為/\d+(?!\.)/,則puts m[0]輸出顯示為 123 。

修飾語修飾語位於正規表示式最結束正規表示式的正斜槓的後面

例如,/abc/i可以匹配abc,abc,abc等。

字串與正規表示式的相互轉換

teststr="a.c"

re=/#/

puts re.match("a.c")[0] #-> a.c

test=re.match("abc")

puts test[0] #-> nil

puts /abc/.inspect #-> /abc/

使用正規表示式的常見方法

例如,puts "test 1 2 and test 3 4".scan(/\d/)會輸出["1","2","3","4"]。

中文正規表示式匹配 正則中文匹配

這篇文章主要講如何使用正則 匹配中文字元,中文正規表示式的匹配規則不像其他正則規則一樣容易記住,下面一起看看這個中文正規表示式是怎麼樣的。w匹配的僅僅是中文,數字,字母,對於國人來講,僅匹配中文時常會用到,見下 匹配中文字元的正規表示式 u4e00 u9fa5 或許你也需要匹配雙位元組字元,中文也是...

中文正規表示式匹配 正則中文匹配

這篇文章主要講如何使用正則匹配中文字元,中文正規表示式的匹配規則不像其他正則規則一樣容易記住,下面一起看看這個中文正規表示式是怎麼樣的。w匹配的僅僅是中文,數字,字母,對於國人來講,僅匹配中文時常會用到,見下 匹配中文字元的正規表示式 u4e00 u9fa5 或許你也需要匹配雙位元組字元,中文也是雙...

常用正規表示式(包括中文匹配)匹配中文正規表示式

常用正規表示式 包括中文匹配 2007 10 24 10 21常用正規表示式 正規表示式用於字串處理 表單驗證等場合,實用高效。現將一些常用的表示式收集於此,以備不時之需。匹配中文字元的正規表示式 u4e00 u9fa5 匹配雙位元組字元 包括漢字在內 x00 xff 應用 計算字串的長度 乙個雙位...