正则表达式
正则表达式在很多场景都适用。例如,验证字符串是否匹配格式,查找匹配的字符串,替换匹配的字符串。
很多编程语言都支持正则表达式,语法也相近。
正则表达式由两部分组成:模式和匹配字符串。
通常我们说的写一个正则表达式,就是写一个模式。然后验证一些输入的字符串是否匹配这个模式。
Regexp
在ruby中模式叫做Regexp。用/.../或者%r(...)包起来的内容就是这个Regexp。
例如
/regexp/
%r(regexp)
haystack中包含y,所以他们就匹配了。
/y/.match('haystack') #=> #<MatchData "y">
haystack中不包含needle,所以就不匹配,返回nil。
/needle/.match('haystack') #=> nil
haystack中包含hay,所以就匹配。
/hay/.match('haystack') #=> #<MatchData "hay">
Metacharacters and Escapes
字符<code>(</code>, <code>)</code>, <code>[</code>, <code>]</code>, <code>{</code>, <code>}</code>, <code>.</code>, <code>?</code>, <code>+</code>, <code>*</code>都是元字符,在模式中特殊的含义,如果想要匹配这些字符串的,需要在它们前面加上反斜杠\,使得这些特殊字符从模式中escape,代表普通的字符。
/1 \+ 2 = 3\?/.match('Does 1 + 2 = 3?') #=> #<MatchData "1 + 2 = 3?">
ruby表达式也可以嵌入到模式中,只要写在#{...}中就可以。
place = "東京都"
/#{place}/.match("Go to 東京都")
#=> #<MatchData "東京都">
Character Classes
用[]括起来的一些字符,看他们是否在match中出现。/[ab]/代表a或b,/ab/代表a后面要跟着b。
/W[aeiou]rd/.match("Word") #=> #<MatchData "Word">
用-连接的两个字符,代表一个范围,[a-d]和[abcd]是一个意思。
[]中可以包含多个范围[a-dx-z]和[abcdxyz]是一个意思。
/[0-9a-f]/.match('9f') #=> #<MatchData "9">
/[9f]/.match('9f') #=> #<MatchData "9">
^代表相反的意思,就是除了模式中^后面的内容。
/[^a-eg-z]/.match('f') #=> #<MatchData "f">
/./,代表任意字符,新行除外。
/./m,代表任意字符,m代表可以匹配多行。
/\w/,代表一个字符,[a-zA-Z0-9]。
/\W/,代表一个非字符,[^a-zA-Z0-9]。
/\d/,代表一个数字,[0-9]。
/\D/,代表一个非数字,[^0-9]。
/\h/,代表一个十六进制字符,[0-9a-fA-F]。
/\H/,代表一个非十六进制字符,[^0-9a-fA-F]。
/\s/<code>,代表一个空白字符,[ \t\r\n\f]/。</code>
/\S/<code>,代表一个非空白字符,[^ \t\r\n\f]/。</code>
Repetition重复
重复符号可以指明字符重复的次数。
<code>*</code> - 0次或多次。
<code>+</code> - 1次或多次。
<code>?</code> - 0次或多次。
<code>{</code>n<code>}</code> - n次。
<code>{</code>n<code>,}</code> - n次或更多。
<code>{,</code>m<code>}</code> - m次或更少。
<code>{</code>n<code>,</code>m<code>}</code> - 最少n次,最多m次。
重复默认是贪婪的,它会尽力向后匹配,匹配更多的内容。懒惰匹配只找到最近的匹配字符串,只做最少量的匹配。
通过添加?就可以使贪婪变成懒惰。
/<.+>/.match("<a><b>") #=> #<MatchData "<a><b>">
/<.+?>/.match("<a><b>") #=> #<MatchData "<a>">
本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/1043505,如需转载请自行联系原作者