Ruby學習筆記-Regex

來源:互聯網
上載者:User

 

1.建立Regex

a)  reg1 = /^[a-z]*$/                             #將模式的定義放在兩個正斜杠之間,返回一個Regexp對象

b)  reg2 = Regexp.new(‘^[a-z]*$’)         #建立一個Regexp對象

c)  reg3 = %r{^[a-z]*$}                       #使用前置的%r

 

2.匹配正則式: String和Regexp都支援以下兩個方法

a) match方法: 匹配成功時返回MatchData類的一個執行個體;否則返回nil;

b) =~ 操作符: 匹配成功,返回一個索引(integer);否則,返回nil;

例:

       puts( /abc/ =~ 'abc' )                 #=>return 0

       puts( /abc/ =~ 'cdg' )                #=>return nil

       puts( /abc/.match('abc') )          #=>return abc

       puts( /abc/.match('cdg') )          #=>return nil

 

3.匹配組

在RubyRegex中,可以用正則式匹配一個或多個子字串;方法是將正

則式用小括弧括起來;使用小括弧指定的擷取子字串,可以將匹配的字串儲存;如下正則式中有兩個組(hi)和(h…o):

  /(hi).*(h...o)/ =~ "The word 'hi' is short for 'hello'."

匹配成功時, 會把匹配的值賦給一些變數(正則式中有多少組就有多少變數), 這些變數可以通過$1,$2,$3…的形式訪問;如果執行上面的那行代碼,可以使用$1,$2來訪問變數:

       print ( $1, " ", $2, "\n" ) #=> hi hello

 

Note: 如果整個正則式匹配不成功,那麼就不會就有變數被初始化, 而是返回nil.

  

4. MatchData類型

前面也提到過了,使用=~時返回的是一個整數或nil, 面使用match方法時會返回MatchData對象, 它包含了匹配模式的結果;乍一看,很像是字串: 

   puts( /cde/.match('abcdefg') ) #=> cde           #=>cde

       puts( /cde/=~('abcdefg') ) #=> cde             #=>2

實際上, 它是MatchData類的一個執行個體且包含一個字串:

       p( /cde/.match('abcdefg') )                         #=> #<MatchData: “cde” >

可以使用MatchData對象的to_a或captures方法返回包含其值的一個數組:

       x = /(^.*)(#)(.*)/.match( 'def myMethod    # This is a very nice method' )

       x.captures.each{ |item| puts( item ) }

上面代碼會輸出:

       def myMethod

       #

       This is a very nice method

 

Note: captures 和to_a方法有一點點區別,後者會包含原始串

       x.captures     #=>["def myMethod ","#"," This is a very nice method"]

       x.to_a           #=>["def myMethod # This is a very nice method","def myMethod ","#"," This is a very nice method"]

 

5. Pre & Post 方法

a)  pre_match或($`): 返回匹配串前的串

b)  post_match或($'): 返回匹配串後的串

  x = /#/.match( 'def myMethod # This is a very nice method' )

  puts( x.pre_match )            #=> def myMethod

  puts( x.post_match )          #=> This is a very nice method

 

6. 貪婪匹配

當一個字串包含多個可能的匹配時,有時可能只想返回第一個匹配的串;

有時可能想返回所有匹配的串,這種情況就叫貪婪匹配;符號*(0 or more) 和 + (1 or more)可以用來進行貪婪匹配。使用符號? (0 or 1) 進行最少匹配;

       puts( /.*at/.match('The cat sat on the mat!') )    #=> returns: The cat sat on the mat

   puts( /.*?at/.match('The cat sat on the mat!') )  #=> returns: The cat

 

7. 字串中的方法

a)  =~ 和match: 用法同Regexp.

b)  String.scan(pattern):儘可能多的去匹配,並把第一個匹配添加到數組中.

  TESTSTR = "abc is not cba"

  b = /[abc]/.match( TESTSTR )           #=> MatchData: "a" puts( "--scan--" )

  a = TESTSTR.scan(/[abc]/)                   #=> Array: ["a", "b", "c", "c", "b", "a"]

此外,還可以給sacn方法傳遞一個block:

      a = TESTSTR.scan(/[abc]/){|c| print( c.upcase ) } #=> ABCCBA

 

c)  String.split(pattern):基於pattern來分割原串並返回一個數組;如果pattern為空白(//),就把原串分割為字元;

  s = "def myMethod      # a comment"

  p( s.split( /m.*d/ ) )      # => ["def ", " # a comment"]

  p( s.split( /\s/ ) )           #=> ["def", "myMethod", "#", "a", "comment"]

  p( s.split( // ) )             # => ["d", "e", "f", " ", "m", "y", "M", "e", "t", "h", "o", "d", " ", "#", " ", "a", " ", "c", "o", "m", "m", "e", "n", "t"]

 

d) String. slice(pattern):返回匹配的串(原串不變),

    String. Slice!(pattern):返回匹配的串並在原串刪除匹配的串(修改了原串的值)

  s = "def myMethod                 # a comment "

  puts( s.slice( /m.*d/ ) )          #=> myMethod

  puts( s )                                 #=> def myMethod # a comment

  puts( s.slice!( /m.*d/ ) )        #=> myMethod

  puts( s )                                    #=> def # a comment

 

8.Regex匹配規則

 

規則

說明

/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個字元

*

代表0或多個字元

+

代表1或多個字元

/d{3}/

匹配3個數字

/d{1,10}/

匹配1-10個數字

d{3,}/

匹配3個數字以上

/([A-Z]\d){5}/

匹配首位是大寫字母,後面4個是數位字串

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.