如果熟悉其他的某種編程語言,對正則表達式應該都不會陌生。正則表達式,又稱正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫爲regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器裏,正則表達式通常被用來檢索、替換那些符合某個模式的文本。
在ruby中正則表達式是在字符串處理中的必備良品,現在記錄一些基礎的概念和用法。
在ruby中,正則表達式使用//(兩個斜槓)包裹起來的,一個最簡單的例子:
"xyz".scan(/./){ |letter| puts letter }
輸出的是
x
y
z
scan方法就是根據提供的正則表達式去掃描整個字符串。首先看這個/./,是用//(兩個斜槓)包裹起來的,這裏的.(點)是個匹配單個字符的通配符,所以這裏這個表達式的意思是單個匹配字符,但後打印出來。
上面說的.(點)是個正則表達式的元字符,類似的還有
\w:匹配字母或數字或下劃線或漢字
\W:匹配所有\w不能匹配的內容
\d:匹配數字
\D:匹配所有\d不能匹配的內容
大寫的W和D真是有趣而任性的設定,我們發現可以用(\w\W)或者(\d\D)匹配任意單個字符。
其實這種正則表達式的元字符還有很多,本文重點討論在ruby中的使用,介紹一些ruby中匹配正則表達式的方法,其他的一些元字符就請讀者查閱其他資料吧。
上面介紹了scan方法,下面介紹一個運算符:=~,這個運算符的結果是一個布爾值,看字符串和正則表達式是否能匹配,例子:
<span style="font-family:SimSun;font-size:18px;">puts "String has vowels" if "Hello world" =~ /[aeiou]/ </span>
輸出是:String has vowels
含義是,"Hello world"和正則表達式/[aeiou]/ 去匹配,如果能匹配上,表達式結果就是true,反之就是false。
另一個重要的方法是match,match方法返回一個匹配上的字符串數組,樣例:
x = "This is a test".match(/(\w+) (\w+)/)
puts x[0]
puts x[1]
puts x[2]
輸出的是:
This is
This
is
返回x數組中,第1個元素(下標爲0)是匹配到的字符串,x[1]就是匹配第一個(\w+)的字符串,x[2]就是匹配第二個(\w+)的字符串。
match方法另外一個重要的好處是,它接受的參數未必是一個正則表達式,可以是一個正則表達式格式的字符串,這樣如果這個正則表達式是外部輸入或者文件讀入時就很方便,可以直接當成字符串處理,以下2行代碼輸出的結果是一樣的:
puts "String has vowels" if "Hello world".match(/[aeiou]/)
puts "String has vowels" if "Hello world".match("[aeiou]")