显示标签为“scan”的博文。显示所有博文
显示标签为“scan”的博文。显示所有博文

2009年5月16日星期六

取出字符串中的一部分

在字符串中,从给定的起始位置开始, 任意长度的字符



p 'abcdefghi'[3..3]    #=> "def" (从3开始3byte)



同样也可以使用给定的起始位置和结束位置,来从字符串中取出这一区间的字符



p 'abcdefghi'[3..5]    #=> "def"
p 'abcdefghi'[3...6]    #=> "def"



以上的方法都是以byte单位为进行计算的
下面使用正则表达式来实现



# 从 a 开始取出3个字符
p 'abcdefghi'.slice(/a../)    #=> "abc"
p 'abcdefghi'.slice(/x../)    #=> nil

# 将所有匹配字符取出
p 'static int fact(int n)'.scan(/\w+/)
    #=> ["static", "int", "fact", "int", "n"]



2009年5月4日星期一

单词的检索

查找在某一字符串中是否含有匹配的单词. 如: 当我们想查找单词 spec 而又不想将 specifsction 一起查找出来时, 我们将要用到正则表达式的 \b (要注意是小写字母b).



p /\bspec\b/ =~ "Ruby spec"")    #=> 5
p /\bspec\b/ =~ "Ruby specifsction"")    #=> nil


因为一个汉字由4字节构成, 所以使用正则表达式的 \b 进行单词检索的方法, 只对英 文单词有效.


p /字符\b/ =~ "字符 abc"    #=> nil



单词的查找
说是单词的查找, 但单词的概念却是很模糊的. 如下提供了三种方法:


# 使用 Ruby 的正则表达式 \w 来实现查找

p " This is \ta 2pen.".scan(/\w+/)
  #=> ["This", "is", "a", "2pen"]



# 使用 Ruby 的正则表达式 /[a-z]+/i 来实现查找

p " This is \ta 2pen.".scan(/[a-z]+/i)
  #=> ["This", "is", "a", "pen"]



# 使用 Ruby 的String#split 方法来实现查找

p " This is \ta 2pen.".split(nil)
  #=> ["This", "is", "a", "2pen."]

2009年5月3日星期日

字符串的查找

查找匹配字符
用正则表达式查找匹配字符时,使用 =~ 运算符.


# 查找含有全角空格和半角空格.

p ([\s\t] =~ 'a c')    #=>  1
p ([\s\t] =~ 'abc')    #=>  nil



查找匹配字符最初出现在位置
查找匹配字符最初出现在位置时,使用 String#index


p 'xxxabcabcabcxxx'.index('abc')    #=>  3
p 'xxxabcabcabcxxx'.index('.')     #=>  nil
p 'xxx..............xxx'.index('.')     #=>  3



查找匹配字符最后出现在位置
查找匹配字符最后出现在位置时,使用 String#rindex


p 'xxxabcabcabcxxx'.rindex('abc')    #=>  9
p 'xxxabcabcabcxxx'.rindex('.')     #=>  nil
p 'xxx..............xxx'.rindex('.')     #=>  16



取得匹配字符外的字符串
取得到匹配字符之后的字符串,使用 Regexp#match


m = /abc/.match('xxxabcabcabcxxx')
p m.post_match    #=>  "abcabcxxx"
m = 'xxxabcabcabcxxx'.match(/abc/)
p m.post_match    #=>  "abcabcxxx"



查找字符串中匹配的所有字符
查找字符串中匹配的所有字符,使用 String#scan


# 查找字符串中的所有字母.
str = "abc所\ndef有\nghi字符\n"
str.scan(/[a-z]+/){ |s|
    p s
}

#=>  "abc"
#=>  "def"
#=>  "ghi"



取得含有匹配字符的一行
含有匹配字符的复数行.使用 String#grep (Enumerble#grep)


# 输出含有字母 a 和 g 的一行.

str = "abc所\ndef有\nghi字符\n"
str.grep(/[ag]/){ |line|
    p line
}

#=>  "abc所\n"
#=>  "ghi字符\n"


以下的两种写法同上相同

str.grep(re){ |line|
    # 处理内容
}



str.each{ |line|
    if re =~ line
        # 处理内容
    end
}