1. 程式人生 > >2.5 正則表示式

2.5 正則表示式

1、正則表示式(Regexp)

正則表示式是對字串操作的公式,用來過濾字串或者從字串中匹配出我們需要的字元,在各類語言中都有應用

2、基礎操作字元

介紹一下常用的幾個字元,想要了解更多功能,可以看看百科中的介紹

百度百科
https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215?fr=aladdin

字元 描述
^ 匹配字串行首,/^a/會匹配到字串“abc”,但不會匹配到“cba”
$ 匹配字串行尾,/a$/會匹配到字串“cba”,但不會匹配到“abc”
. 表示一個任意字元
\d 表示一個數字字元
\w 表示一個單詞字母(包括下劃線)
{n,m} 表示m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。m為空時表示無窮大
* 匹配任意次,等價於{0,}
+ 匹配一次或多次,等價於{1,}
? 匹配零次或一次,等價於{0,1}
[xyz] 字元集合。匹配所包含的任意一個字元。例如,“[abc]”可以匹配“plain”中的“a”
() 將( ) 之間的表示式定義為“組”(group),並且將匹配這個表示式的字元儲存到一個臨時區域(一個正則表示式中最多可以儲存9個),實際操作會經常用到,這樣說比較抽象,我們下面會實際舉例

3、型別轉換

(1)字串轉換為正則表示式 Regexp.new(str1),可以將字串str1轉換成正則表示式,如果正則表示式裡面有轉義字元,需要在轉義字元前面加反斜槓。
irb(main):001:0> str1 = "abc"
=> "abc"
irb(main):002:0> Regexp.new(str1)
#已經轉成了正則表示式
=> /abc/
irb(main):003:0> "abcdef" =~ Regexp.new(str1)
#返回的不是nil,說明已經匹配上了
=> 0

3、正則表示式在ruby中的應用

(1)=~ 判斷正則表示式是否匹配到字串,匹配的話,返回字串匹配字元的首個索引,否則返回nil
#定義一個匹配時間的正則表示式
irb(main):012:0> REG = /20\d{2}-?\d{2}-?\d{2}/
=> /20\d{2}-?\d{2}-?\d{2}/
#返回0,說明字串從第一個字元開始匹配到正則表示式
irb(main):013:0> REG =~ "2018-09-08"
=> 0
#返回nil說明沒有匹配上
irb(main):014:0> REG =~ "201-09-08"
=> nil

正則表示式解析:
這是一個匹配日期的正則表示式,我們分成兩部分解釋
第一部分:20\d{2}
\d{2}代表兩個數字字元,總體代表20後面跟著兩個數字字元,能匹配到"2018-09-08”字串中的“2018”
第二部分:-?\d{2}
-?代表0個或者1個“-”字元,說明這個正則表示式能匹配"2018-09-08”,也能匹配“20180908”

(2)match 描述匹配的MatchData物件,如果沒有匹配,則返回nil。經常與正則表示式字元中()搭配使用
#定義一個正則表示式
irb(main):018:0> REG1 = /20\d{2}-?\d{2}-?\d{2}/
=> /20\d{2}-?\d{2}-?\d{2}/
#返回一個MatchData物件,賦值到m變數中。MatchData物件可以看成一個數組。
#第一個值(索引為0)為整個正則表示式匹配到的字串,第二個值(索引為1)為正則表示式第一個括號裡面匹配到的值,以此類推。
irb(main):019:0> m = REG1.match("2018-09-08-07-06-05")
=> #<MatchData "2018-09-08">
#第一個值為/20\d{2}-?\d{2}-?\d{2}/匹配到的值
irb(main):020:0> m[0]
=> "2018-09-08"
#第二個值為正則表示式第一個括號裡面匹配到的值,因為此正則表示式沒有括號,所以第二個值為空
irb(main):021:0> m[1]
=> nil
#定義一個正則表示式,將20\d{2}部分用括號括起來
irb(main):023:0> REG2 = /(20\d{2})-?\d{2}-?\d{2}/
=> /(20\d{2})-?\d{2}-?\d{2}/
#返回一個MatchData物件
irb(main):024:0> m2 = REG2.match("2018-09-08")
=> #<MatchData "2018-09-08" 1:"2018">
#第一個值為/(20\d{2})-?\d{2}-?\d{2}/匹配到的值
irb(main):025:0> m2[0]
=> "2018-09-08"
#第二個值為20\d{2}括號裡面的內容匹配到的值
irb(main):026:0> m2[1]
=> "2018"
irb(main):028:0> REG3 = /(20\d{2})-?(\d{2})-?(\d{2})/
=> /(20\d{2})-?(\d{2})-?(\d{2})/
#返回一個MatchData物件,m[0]為"2018-09-08",m[1]為"2018",m[2]為"09"
irb(main):029:0> m3 = REG3.match("2018-09-08")
=> #<MatchData "2018-09-08" 1:"2018" 2:"09" 3:"08">
irb(main):030:0> m3[0]
=> "2018-09-08"
irb(main):031:0> m3[1]
=> "2018"
irb(main):032:0> m3[2]
=> "09"