【翻譯】Programming Ruby——Regex

來源:互聯網
上載者:User

Regex

Ruby大部分的內建類型都和其它的程式設計語言很相似。主要有strings,integers,floats,arrays等等。然而,只有指令碼語言,

如Ruby,Perl,和awk等提供了內建運算式類型的支援。慚愧的是:Regex儘管比較隱蔽,但卻是一個很強大的文本處理工具。

內建它們比單純的添加介面類庫有著很大的區別。

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

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

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

/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時,輸出一條資訊。

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

使用Ruby的替代方法能把字串中匹配Regex的部分文本替換成其它文本。

  line.sub(/Perl/, 'Ruby') # replace first 'Perl' with 'Ruby'
  line.gsub(/Python/, 'Ruby') # replace every 'Python' with 'Ruby'

你能使用Ruby替換所有出現有Perl和Python的地方。
  line.gsub(/Perl|Python/, 'Ruby')

把上面的知識綜合在一起,代碼如下:

line = 'I like Python program. It is a good lanuage.
  I havent learned about Perl. Do you know Perl?'
if line =~ /Perl|Python/
  puts "Scripting language mentioned: #{line}"
end
puts "run line.sub(/Perl/, 'Ruby')"
puts line.sub(/Perl/, 'Ruby')
puts "run line.gsub(/Python/, 'Ruby')"
puts line.gsub(/Python/, 'Ruby')
puts "run line.gsub(/Perl|Python/, 'Ruby')"
puts line.gsub(/Perl|Python/, 'Ruby')

輸出的結果如下:

Scripting language mentioned: I like Python program. It is a good lanuage.

  I havent learned about Perl. Do you know Perl?

run line.sub(/Perl/, 'Ruby')

I like Python program. It is a good lanuage.

  I havent learned about Ruby. Do you know Perl?

run line.gsub(/Python/, 'Ruby')

I like Ruby program. It is a good lanuage.

  I havent learned about Perl. Do you know Perl?

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

I like Ruby program. It is a good lanuage.

  I havent learned about Ruby. Do you know Ruby?

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.