Ruby程式中Regex的基本使用教程_ruby專題

來源:互聯網
上載者:User

Ruby大部分的內建類型都和其它的程式設計語言很相似。主要有strings,integers,floats,arrays等等。然而,只有指令碼語言,如Ruby,Perl,和awk等提供了內建運算式類型的支援。Regex儘管比較隱蔽,但卻是一個很強大的文本處理工具。

Regex是使用指定的模式比對字元串的一種簡單的方法。在Ruby中,建立Regex的典型方式是把模式寫在兩個斜線之間/pattern/。

畢竟,Ruby就是Ruby,Regex也是對象,也能像對象般操作。

例如,你可以使用下面的Regex寫一個模式,它匹配一個字串中包含有Perl或Python。

<!--more-->/Perl|Python/

在正斜線體內,是兩個我們要匹配的字串,它們使用"|"分隔。這個管道符的意思是"左邊的或者右邊的",在這個模式中是Perl或者Python。

你還可以在模式中使用括弧,就像是在算術運算式中使用的那樣,因此這個模式還可以寫成

/P(erl|ython)/

你還可以在模式中指定重複。例如加號,/ab+c/匹配字串中一個a後面有一個或多個b然後跟著是一個c。把加號換成星號,/ab*c/建立的Regex是匹配一個a後面跟著0個或多個b然後跟著是一個c。

你還可以在模式中匹配一組字元。常用的字元類型例子有\s,它匹配一個空白字元(space,tab,分行符號,等等);\d匹配任一數字;\w匹配任意的典型單詞字元。句號(.)匹配(基本上)任一字元。

我們把所有這些組合起來,做成實用的Regex。

/\d\d:\d\d:\d\d/ # a time such as 12:34:56/Perl.*Python/  # Perl, zero or more other chars, then Python/Perl Python/  # Perl, a space, and Python/Perl *Python/  # Perl, zero or more spaces, and Python/Perl +Python/  # Perl, one or more spaces, and Python/Perl\s+Python/ # Perl, whitespace characters, then Python/Ruby (Perl|Python)/ # Ruby, a space, and either Perl or Python

一但建立了一個模式,不能使用它是件很鬱悶的事情。匹配操作符=~用來對一個字串進行Regex匹配。如果匹配成功,=~返回第一次匹配成功的位置,否則它返回nil。也就是說,你可以在if和while的條件聲明中使用Regex。例如下面的程式碼片段,

如果字串中包含有文本Perl或Python時,輸出一條資訊。

puts "Scripting language mentioned: #{line}" if line =~ /Perl|Python/

你能使用Ruby替換所有出現有Perl和Python的地方。

line.gsub(/Perl|Python/, 'Ruby')

從iHower的Ruby on Rails實戰聖經中摘一個樣本,用Regex抓取手機號碼:

phone = "139-1234-5678"if phone =~ /(\d{3})-(\d{4})-(\d{4})/ start_with = $1 mid_num = $2 end_as = $3end

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

  • /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}/匹配3個數字。
  • /d{1,10}/匹配1-10個數字。
  • /d{3,}/匹配3個數字以上。
  • /([A-Z]\d){5}/匹配首位是大寫字母,後面4個是數位字串。

Regex操作

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

puts "I can say my name" =~ /name/ #-> 13a = /name/.match("I can say my name, my name I can say") #-> a is MatchDataputs 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,Mrsb2=/(([A-Za-z]+),([A-Za-z]+)),Mrs?\./.match("Jack,Wang,Mrs., nice person:)puts b2[0] #-> Jack,Wang,Mrsputs b2[1] #-> Jack,Wangputs b2[2] #-> Jackputs b2[3] #-> Wang

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

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

貪婪量詞和不貪婪量詞

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

下面代碼是: 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 。

修飾語

修飾語位於Regex最結束Regex的正斜杠的後面

1.i使Regex對大小寫不敏感
例如,/abc/i可以匹配Abc,abc,ABC等。

2.m使得Regex可以和任何字元匹配,包括分行符號,通常情況下圓點萬用字元不匹配分行符號。
字串與Regex的相互轉換

字串插入進Regex

teststr="a.c"re=/#{Regexp.escape(teststr)}/puts re.match("a.c")[0] #-> a.ctest=re.match("abc")puts test[0] #-> Nil

Regex轉換成字串

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

使用Regex的常見方法:

  • 用於if和while等
  • 用於gsub、grep等
  • 用於find_all、scan等

例如,puts "test 1 2 and test 3 4".scan(/\d/)會輸出["1","2","3","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.