国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Ruby - Ruby程序中正則表達(dá)式的基本使用教程

Ruby程序中正則表達(dá)式的基本使用教程

2020-05-09 10:45kevinhua Ruby

和Python與Perl一樣,Ruby對(duì)正則表達(dá)式的支持也是相當(dāng)好的,這里送出整理的Ruby程序中正則表達(dá)式的基本使用教程,需要的朋友可以參考下

Ruby大部分的內(nèi)置類型都和其它的編程語言很相似。主要有strings,integers,floats,arrays等等。然而,只有腳本語言,如Ruby,Perl,和awk等提供了內(nèi)置表達(dá)式類型的支持。正則表達(dá)式盡管比較隱蔽,但卻是一個(gè)很強(qiáng)大的文本處理工具。

正則表達(dá)式是使用指定的模式匹配字符串的一種簡(jiǎn)單的方法。在Ruby中,創(chuàng)建正則表達(dá)式的典型方式是把模式寫在兩個(gè)斜線之間/pattern/。

畢竟,Ruby就是Ruby,正則表達(dá)式也是對(duì)象,也能像對(duì)象般操作。

例如,你可以使用下面的正則表達(dá)式寫一個(gè)模式,它匹配一個(gè)字符串中包含有Perl或Python。

?
1
2
3
<!--more-->
 
/Perl|Python/

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

你還可以在模式中使用括號(hào),就像是在算術(shù)表達(dá)式中使用的那樣,因此這個(gè)模式還可以寫成

?
1
/P(erl|ython)/

你還可以在模式中指定重復(fù)。例如加號(hào),/ab+c/匹配字符串中一個(gè)a后面有一個(gè)或多個(gè)b然后跟著是一個(gè)c。把加號(hào)換成星號(hào),/ab*c/創(chuàng)建的正則表達(dá)式是匹配一個(gè)a后面跟著0個(gè)或多個(gè)b然后跟著是一個(gè)c。

你還可以在模式中匹配一組字符。常用的字符類型例子有\(zhòng)s,它匹配一個(gè)空白字符(space,tab,換行符,等等);\d匹配任意數(shù)字;\w匹配任意的典型單詞字符。句號(hào)(.)匹配(基本上)任意字符。

我們把所有這些組合起來,做成實(shí)用的正則表達(dá)式。

?
1
2
3
4
5
6
7
/\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

一但創(chuàng)建了一個(gè)模式,不能使用它是件很郁悶的事情。匹配操作符=~用來對(duì)一個(gè)字符串進(jìn)行正則表達(dá)式匹配。如果匹配成功,=~返回第一次匹配成功的位置,否則它返回nil。也就是說,你可以在if和while的條件聲明中使用正則表達(dá)式。例如下面的代碼片段,

如果字符串中包含有文本Perl或Python時(shí),輸出一條信息。

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

你能使用Ruby替換所有出現(xiàn)有Perl和Python的地方。

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

從iHower的Ruby on Rails實(shí)戰(zhàn)圣經(jīng)中摘一個(gè)示例,用正則表達(dá)式抓取手機(jī)號(hào)碼:

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

一般規(guī)則(為正常顯示,都放在代碼塊內(nèi))

  • /a/匹配字符a。   
  • /\?/匹配特殊字符?。特殊字符包括^, $, ? , ., /, \, [, ], {, }, (, ), +, *.   
  • .匹配任意字符,例如/a./匹配ab和ac。   
  • /[ab]c/匹配ac和bc,[]之間代表范圍。例如:/[a-z]/ , /[a-zA-Z0-9]/。   
  • /[^a-zA-Z0-9]/匹配不在該范圍內(nèi)的字符串。   
  • /[\d]/代表任意數(shù)字
  • /[\w]/代表任意字母,數(shù)字或者_(dá)
  • /[\s]/代表空白字符,包括空格,TAB和換行。   
  • /[\D]/,/[\W]/,/[\S]/均為上述的否定情況。

高級(jí)規(guī)則

  • ?代表0或1個(gè)字符。/Mrs?\.?/匹配"Mr","Mrs","Mr.","Mrs."。
  • *代表0或多個(gè)字符。/Hello*/匹配"Hello","HelloJack"。
  • +代表1或多個(gè)字符。/a+c/匹配:"abc","abbdrec"等等。
  • /d{3}/匹配3個(gè)數(shù)字。
  • /d{1,10}/匹配1-10個(gè)數(shù)字。
  • /d{3,}/匹配3個(gè)數(shù)字以上。
  • /([A-Z]\d){5}/匹配首位是大寫字母,后面4個(gè)是數(shù)字的字符串。

正則表達(dá)式操作

String和RegExp均支持=~和match兩個(gè)查詢匹配方法:

?
1
2
3
4
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返回一個(gè)MatchData對(duì)象。如果不匹配,則返回nil。MatchData可以取出其中符合各個(gè)子匹配(或子模式)的內(nèi)容,看下面的例子:

?
1
2
3
4
5
6
7
8
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]返回匹配匹配主表達(dá)式的字符串,下面的方法是等同的:m[n]==m.captures[n]

Ruby也自動(dòng)的為我們填寫一些全局變量,它們以數(shù)字做名,$1, $2, 等等,$1包含的是正則表達(dá)式中從左側(cè)開始的第一對(duì)小括號(hào)內(nèi)的子模式所匹配的字符串,以此類推。我們看出匹配時(shí),是從外到內(nèi),從左到右的順序。

貪婪量詞和不貪婪量詞

量詞*(表示零個(gè)或多個(gè))和+(表示一個(gè)或多個(gè))是貪婪的,它們會(huì)匹配盡可能多的字符,我們可以在*和+后面加一個(gè)?,使它成為非貪婪量詞:

下面代碼是: 1個(gè)或多個(gè)字符后接一個(gè)感嘆號(hào)。

?
1
2
3
4
5
6
teststr="abcd!efg!"
match=/.+!/.match(teststr)
puts match[0] #-> abcd!efg!
 
limitmatch=/.+?!/.match(teststr)
puts limitmatch[0] #-> abcd!

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

  • ^     行首
  • $     行尾
  • \A    字符串的開始
  • \z    字符串的結(jié)尾
  • \Z    字符串的結(jié)尾(不包括最后的換行符)
  • \b    單詞邊界
?
1
2
3
c=/\b\w+\b/.match("!!Stephen**")
 
puts c[0] #-> Stephen

前視斷言

前視斷言表示想要知道下一個(gè)指定的是什么,但并不匹配

肯定的前視斷言 (?=)
假設(shè)我們想要匹配一個(gè)數(shù)的序列,該序列以一個(gè)圓點(diǎn)結(jié)束,但并不想把圓點(diǎn)作為模式匹配的一部分

?
1
2
3
teststr="123 456 789. 012"
m=/\d+(?=\.)/.match(teststr)
puts m[0] #-> 789

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

修飾語

修飾語位于正則表達(dá)式最結(jié)束正則表達(dá)式的正斜杠的后面

1.i使正則表達(dá)式對(duì)大小寫不敏感
例如,/abc/i可以匹配Abc,abc,ABC等。

2.m使得正則表達(dá)式可以和任何字符匹配,包括換行符,通常情況下圓點(diǎn)通配符不匹配換行符。
字符串與正則表達(dá)式的相互轉(zhuǎn)換

字符串內(nèi)插進(jìn)正則表達(dá)式

?
1
2
3
4
5
teststr="a.c"
re=/#{Regexp.escape(teststr)}/
puts re.match("a.c")[0] #-> a.c
test=re.match("abc")
puts test[0] #-> Nil

正則表達(dá)式轉(zhuǎn)換成字符串

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

使用正則表達(dá)式的常見方法:

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

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

延伸 · 閱讀

精彩推薦
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個(gè)技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • Ruby簡(jiǎn)要說明Ruby中的迭代器

    簡(jiǎn)要說明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動(dòng)態(tài)語言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
  • RubyRuby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼,數(shù)據(jù)是隨機(jī)的,所以每次的記錄都會(huì)不同。 ...

    ruby教程網(wǎng)2962020-04-10
  • RubyCentOS中配置Ruby on Rails環(huán)境

    CentOS中配置Ruby on Rails環(huán)境

    經(jīng)過一個(gè)上午的折騰,終于把ROR環(huán)境在CentOS中搞定,繞了很多彎路,把文章寫下來總結(jié)一下 ...

    可樂加糖4762020-04-12
  • RubyRuby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    這篇文章主要介紹了Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例,建造者模式將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表...

    范孝鵬2192020-05-07
  • Ruby剖析 Ruby 訪問控制

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數(shù),只有方法.而且實(shí)際上有不止一種方法.這一節(jié)我們介紹 訪問控制 (accesscontrols). 想想當(dāng)我們?cè)谧罡邔佣皇窃谝粋€(gè)類的定義里定義...

    ruby教程網(wǎng)3572020-04-08
  • RubyRuby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象

    Ruby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象

    這篇文章主要介紹了Ruby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象,本文是學(xué)習(xí)筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • RubyRuby環(huán)境下安裝使用bundler來管理多版本的gem

    Ruby環(huán)境下安裝使用bundler來管理多版本的gem

    這篇文章主要介紹了Ruby環(huán)境下安裝使用bundler來管理多版本的gem的方法,舉了Ruby On Rails中的應(yīng)用實(shí)例來進(jìn)行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
主站蜘蛛池模板: 一区二区三区 在线 | 老色批影院 | 久久免费精品视频 | 久久精品国产精品亚洲 | 福利在线播放 | 免费激情网站 | 亚洲国产91 | 成人毛片在线观看 | 亚洲一区二区三 | 伊人欧美一区 | 日韩高清中文字幕 | 精品一二区 | 久久99国产精品久久99大师 | 毛片在线视频 | √天堂在线 | 欧美日日| 一区二区三区在线 | 日韩av一区二区在线观看 | 欧美劲爆第一页 | 日韩一区二区三区在线看 | 欧美成人精品一区二区三区 | 一区二区免费在线观看 | 中文字幕av一区二区三区 | 欧美日韩精品一区二区三区 | 国产成人一区二区三区 | 亚洲精品一区二区网址 | 色播av | 久久亚洲天堂 | 自拍偷拍亚洲欧美 | 一区二区免费视频 | 在线国产视频 | 91av在线电影 | 在线观看日韩 | 日韩av免费在线 | 真实的国产乱xxxx在线 | 色图自拍偷拍 | 香蕉av在线 | 久久精品福利 | av中文字幕观看 | 日韩欧美二区 | 亚洲一区电影 |