一、Regexp类的一些方法:
Regexp.new/compile (string/regexp,[options,[lang]]) : 构造一个正则表达式对象。第一个参数是一个字符串或者正则表达式;第二个参数是 正则表达式修饰符的按位OR。
Regexp.escape/quote (string) : 对正则表达式中的特殊字符进行转义。如:
Regexp.escape('\\*?{}.') #=> \\\\\*\?\{\}\.
rxp.match (str) : 返回一个表示匹配结果的MatchData 对象。如果没有匹配则返回nil
str = "a123b456c789"
refs = /(a\d+)(b\d+)(c\d+)/.match(str)
puts refs[0] # "a123b456c789"
puts refs[1,3] # ["a123","b456","c789"]
refs.to_a.each {x| x} # MatchData对象不是数组,在进行迭代前要调用to_a方法将其转换为一个数组。
也可以使用全局变量$1,$2等引用匹配结果:
refs = /(a\d+)(b\d+)(c\d+)/.match("a123b456c789")
puts "'#$1','#$2','$3'" # 'a123','b456','c789'
在sub、gsub等方法中, 不能使用$1等来引用结果,因为这些参数在调用方法前就已经计算好。这时,可以采用特殊编码\1,\2等:
refs = /(a\d+)(b\d+)(c\d+)/.match("a123b456c789")
puts "'#$1','#$2','$3'" # 'a123','b456','c789'
"a123b456c789".sub(/(a\d+)(b\d+)(c\d+)/, '1st=\1, 2nd=\2, 3rd=\3') # 1st=a123, 2nd=b456, 3rd=c789
"a123b456c789".sub(/(a\d+)(b\d+)(c\d+)/, "1st=\\1, 2nd=\\2, 3rd=\\3") # 1st=a123, 2nd=b456, 3rd=c789
# 上面两个sub方法中,第一个使用的是单引号;第二个是双引号,需要使用双语义
MatchData对象还有以下一些有用的方法:
1. begin(n) : 返回第n个匹配开头的偏移量
2. end(n) : 返回第n个匹配结束的偏移量(等于第n+1个匹配的开头偏移量)
3. offset(n) : 返回一个包含第n个匹配开头和结束偏移量的数组
4. pre_match : 返回匹配子字符串前面的字符串部分
5. post_match : 返回匹配子字符串后面的字符串部分
二、一些常用的标记
1. ^ 和 $ : 行或字符串开头/结尾(注意:匹配单行的行头/行尾)。
src = "abc\ndef\nghi"
/^abc/ =~ src #0
/^def/ =~ src #4
/def$/ =~ src #4
/ghi$/ =~ src #8
2. \A 和 \Z : 整个字符串的开头/末尾或最后的换行符前
\z : 基本同 \Z,但是不能匹配最后的换行符
src = "abc\ndef\nghi"
/\Aabc/ =~ src #0
/\Adef/ =~ src #nil
/def\Z/ =~ src #nil
/ghi\Z/ =~ src #8
/ghi\z/ =~ src #8
src << "\n"
/ghi\Z/ =~ src #8
/ghi\z/ =~ src #nil
3. \b : 单词边界(在[]外); \B : 非单词边界
src = "this is a test"
src.gsub(/\b/, '|') # "|this| |is| |a| |test|"
src.gsub(/\B/, '-') # "t-h-i-s i-s a t-e-s-t"
4. {?=} : 正预查 ,当匹配子字符串sub后面接着的字符串与预查中=号后面的字符串匹配时,sub才匹配成功;{?!}: 负预查,当匹配子字符串sub后面接着的字符串与预查中=号后面的字符串不匹配时,sub才匹配成功。
/(a\d+)(?=b)(b\d+)(c\d+)/.match("a123b456c789") # ['a123','b456','c789']
/(a\d+)(?=c)(b\d+)(c\d+)/.match("a123b456c789") # nil
/(a\d+)(?=b)(\d+)(c\d+)/.match("a123b456c789") # nil
/(a\d+)(?!c)(b\d+)(c\d+)/.match("a123b456c789") # ['a123','b456','c789'
5. () : 子表达式编组; (?:) : 非捕获组
refs = /(a\d+)(b\d+)(c\d+)/.match("a123b456c789")
puts "'#$1','#$2','$3'" # 'a123','b456','c789'
refs = /(a\d+)(?:b\d+)(c\d+)/.match("a123b456c789")
puts "'#$1','#$2','$3'" # 'a123','c789','nil'
6. 字符类:包括在方括号[]中的一组字符,其中每一个子匹配是任意一个字符。
(1) ^用于字符类的开头时有特殊意义,它对字符列表取反。
(2) 像.和?之类的元字符在字符类中没有特殊含义,表示自身代表的字符。而\n这样的转义序列仍然有效。
(3) 连字符-用于字符类的开头或结尾,脱字符^用于字符类的中间时,没有特殊含义,只表示自身;左括号[和右括号]用于字符类中时,也是如此,而且还必须显示进行转义。
/[abc]/ =~ "abcd" #0
/[^abc]/ =~ "abcd" #3
/[.?abc]/ =~ ".?" #0
/[-^\[\]]/ =~ "^" #0
7. 几个修饰符的介绍
(1) i : 正则表达式不区分大小写
(2) o : 只执行一次表达式替换
(3) m : 多行模式(句点匹配换行)
(4) x : 扩展正则表达式(允许空白、注释)
三、一些常用正则表达式实例
1. 匹配IP地址
num = /\d|[01]?\d\d|2[0-4]\d|25[0-5]/
ip = /^(#{num}\.){3}#{num}$/
ip =~ '192.168.0.50' # 0
ip =~ '192.168.0.500' # nil
2. 匹配email地址
before_at = /([a-zA-Z0-9]+(_?[a-zA-Z0-9])+)/
after_at = /[a-zA-Z]+(-?[a-zA-Z])+(\.[a-zA-Z]+)+/
email = /^(#{before_at}@#{after_at})$/
email =~ 'abc_123@xyz.com.cn' #0
email =~ 'abc_123@xyz.com' #0
email =~ 'abc_@xyz.com.cn' #nil
email =~ 'abc_123@xy-z.com.cn' #0
email =~ 'abc_123@xyz-.com.cn' #nil
3. 匹配时间/日期类型(yyyy.mm.dd hh:mm:ss)
yyyy = /[1-9]\d\d\d/
mm = /0?[1-9]|1[12]/
dd = /0?[1-9]|[12]\d|3[01]/
hh = /[01]?[1-9]|2[0-4]/
MM = /[0-5]\d/
ss = /[0-5]\d/
date_time = /^(#{yyyy}\.#{mm}\.#{dd}) (#{hh}:#{MM}:#{ss})$/
date_time =~ '2008.8.27 22:12:10' # 0
date_time =~ '2008.8.27 22:12:60' # nil
分享到:
相关推荐
### Ruby正则表达式规则详解 #### 一、引言 在Ruby编程语言中,正则表达式(Regular Expression)是一种强大的文本处理工具,被广泛应用于字符串搜索与替换、数据验证以及模式匹配等场景。本篇文章将深入探讨Ruby...
js_regex,将Ruby正则表达式转换为JavaScript正则表达式。.zip
如今,正则表达式已经成为众多语言及工具--Perl、PHP、Java、Python、Ruby、MysQL、VB-NET和c#(以及.NETFramework中的任何语言)--中的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本处理。...
如今,正则表达式已经成为众多语言及工具——Perl、PHP、Java、Python、Ruby、MysQL、VB.NET和c#(以及.NET Framework中的任何语言)——中的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本...
《正则表达式经典实例》这本书深入浅出地介绍了正则表达式的基本概念和高级特性,并提供了丰富的实例,覆盖了C#、Java、JavaScript、Perl、PHP、Python、Ruby和VB.NET等多种编程语言。 #### 二、核心内容概览 1. *...
### 正则表达式的全面掌握 #### 一、正则表达式概述 正则表达式是一种功能强大的文本处理工具,可以用于在各种编程语言中进行数据的搜索、替换以及提取等操作。它作为一种标准特性已经广泛应用于多种流行的语言与...
如今,正则表达式已经成为众多语言及工具——Perl、PHP、Java、Python、Ruby、MysQL、VB-NET和c#(以及.NETFramework中的任何语言)——中的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本...
正则表达式不仅限于Python,许多编程语言都支持正则表达式,包括Java、JavaScript、Perl、Ruby等。 正则表达式的组成部分: 1. 字符:包括字母、数字、特殊字符等。 2. 元字符:包括.、*、+、?、{、}、[、]、\、^...
PLSQL.jgcscs、PHPsolo.jgcscs、Ruby.jgcscs分别对应Oracle的PL/SQL、PHP和Ruby语言的正则表达式配置,确保在这些语言中使用的正则表达式能够准确无误地工作。 总的来说,这个“完全自动的正则表达式编写工具”是一...
在多种编程语言中,如Perl、Java、JavaScript、C#、PHP、Python、Ruby、Tcl、MySQL、Oracle等,正则表达式都扮演着重要的角色。 学习正则表达式可以做以下事情: 1. **查找字符串**:你可以使用正则表达式来检查一...
《正则指引》针对作者在开发中遇到的实际问题,以及其他开发人员咨询的问题,总结出一套使用正则表达式解题的办法,并通过具体的例子指导读者拆解、分析问题。全书分为三大部分:第一部分主要讲解正则表达式的基础...
如今,正则表达式已经成为众多语言及工具——Perl、PHP、Java、Python、Ruby、MySQL、VB.NET和C#(以及.NET Framework中的任何语言)——中的标准特性,依靠它,你能以之前完全不敢设想的方式进行复杂而精巧的文本...
"正则表达式工具 for mac" 是一款专为Mac用户设计的高效软件,它允许用户在多种语言环境中如PHP、JavaScript、Python、Golang、Java、Ruby、Perl以及C#中编写和测试正则表达式。 这款工具的特色在于其多语言支持,...
- **Ruby**:介绍了Ruby中面向对象的正则表达式接口。 - **JavaScript**:讨论了JavaScript中的`RegExp`对象。 - **PCRE**:介绍了Perl兼容正则表达式库(PCRE)的功能。 - **Apache Web Server**:讲解了如何在...
The Book Of Ruby Ruby 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式