本博主要做速查表用,详细资料可参考:http://www.ruby-doc.org/core-2.0/Regexp.html
一、正则表达式的表示方法
- 用两个'/'即/.../表示,例:/http:\/\/www\.example\.org/
- 用%r{}表示,例:%r{\w+\.\w+}
- 用Regexp.new生成,例:r = Regexp.new 'hello\s*world'
二、特殊匹配规则
- /./ - 匹配任何字符,除了新行
- /^/ - 行首
- /$/ - 行尾
- /\d/ - 匹配数字,等价[0-9]
- /\w/ - 匹配字母、数字、'_',等价[a-zA-Z0-9_]
- /\h/ - 匹配十六进制字符,等价[0-9a-fA-F]
- /\s/ - 匹配空格、'\t'、'\r'、'\n',等价[ \t\r\n\f]
以上规则的大写形式/\D/、/\W/、/\S/、/\H/表示相应的否定形式
- * - 匹配0个以上
- + - 匹配1个以上
- ? - 匹配0个或1个
- {n} - 匹配n个
- {n,} - 匹配n个或以上
- {,m} - 匹配m个或以下
- {n,m} - 匹配n到m个,含n、m
注意ruby的正则表达式默认是贪婪匹配的,如果要尽量少的匹配可在原表达式后加'?',如/\w+?_/匹配"abc_def_"结果是"abc_"而不是"abc_def_"
- /.../m - 使换行符可被'.'匹配,多行匹配
- /.../i - 忽略大小写
- /.../x - 忽略空格和正则表达式中的注释
- /.../o - 只执行一次#{}
- /.../u - 匹配UTF-8
- /.../e - 匹配EUC-JP,日本人写的没办法,羡慕啊
- /.../s - 匹配Windows-31J
- /.../n - 匹配ASCII-8BIT
三、正则表达式操作
1、匹配
- =~ - 肯定匹配,返回第一个匹配的位置(从0开始),匹配失败返回nil,例:/hello/ =~ 'hello world' #=> 0
- !~ - 否定匹配,不能匹配返回true,匹配成功返回false,例:/hello/ =~ 'hello world' #=> false
- match - 返回MatchData类型,失败则返回nil,用法类似数组,例:m = /\d+-(\d+)/.match '123-45678' # m[0] == '123-45678', m[1] == '45678'
2、替换
- str.sub(/.../, '...') - 替换一次,例:puts "hello world".sub(/world/, 'ruby') #=> hello ruby
- str.gsub(/.../, '...') - 全局替换,例:puts "hello world".gsub(/\w/, '*') #=> ***** *****
在sub和gsub后加'!'可以修改原有字符串,否则只是返回一个新的字符串
3、匹配所有
str.scan(/.../) { |item| ... },扫描匹配所有,item可以使用[]操作选取子匹配