ruby中match和scan的用法

match

只匹配第一次,返回为MatchData类型。

如果未能找到,返回nil

如果找到返回结果中包括两部分:1、完整匹配部分  2、()匹配到的内容

如:

a='a1b2<td>a1b3</td><td>a2b4</td>'
b=a.match(/<td>([a-z1-9]{4})<\/td><td>([a-z1-9]{4})<\/td>/)

#<MatchData "<td>a1b3</td><td>a2b4</td>" 1:"a1b3" 2:"a2b4">

scan:

查找全部匹配的内容。如果正则表达是中带有(),则只记录()的匹配内容。

返回结果为数组,如果没有匹配的结果,数组长度为0,否则返回匹配内容

如:

a='a1b2<td>a1b3</td><td>a2b4</td>'
b=a.scan(/<td>[a-z1-9]{4}<\/td>/)
#没有包含()内容,直接匹配正则内容。
#["<td>a1b3</td>", "<td>a2b4</td>"]

b=a.scan(/<td>([a-z1-9]{4})<\/td>/)
#包含()内容,记录()中的内容
#[["a1b3"], ["a2b4"]]

ruby正则表达式中的编码问题

问题描述:

用ruby写一个抓网页分析的小程序,用match进行正则表达式匹配时,常常会遇到编码的问题。

比如一个简单的程序:

def getSomething
    uri = URI('http://blog.163.com/ma95221@126/blog/static/2482210220100159516893/')
    s=Net::HTTP.get(uri)
    r=r=s.match(/先建个\w\w\w/)
    if(r!=nil)
        puts "haha"
    else
        puts "false"
     end
end

运行时会报错: `match’: invalid byte sequence in UTF-8 (ArgumentError)

原因是加载的内容不是utf-8编码,通过下面两步可以解决

s.force_encoding("GBK")    #先将字符认为成GBK
s=s.encode("UTF-8)        #将字符按照UTF-8来编码