1. 一般规则:
/a/ 匹配字符a。
/\?/ 匹配特殊字符?。特殊字符包括^, $, ? , ., /, \, [, ], {, }, (, ), +, *.
. 匹配任意字符,例如/a./匹配ab和ac
/[ab]c/ 匹配ac和bc,[]之间代表范围。例如:/[a-z]/ , /[a-zA-Z0-9]/
/[^a-zA-Z0-9]/ 匹配不在该范围内的字符串
/[\d]/ 代表任意数字
/[\w]/ 代表任意字母,数字或者_
/[\s]/ 代表空白字符,包括空格,TAB和换行
/[\D]/,/[\W]/,/[\S]/ 均为上述的否定情况
2. 高级规则:
? 代表0或1个字符。/Mrs?\.?/匹配"Mr","Mrs","Mr.","Mrs."
“*” 代表0或多个字符。/Hello*/匹配"Hello",“HelloJack”
+ 代表1或多个字符。/a+c/匹配:"abc","abbdrec"等等
/\d{3}/ 匹配3个数字
/\d{1,10}/ 匹配1-10个数字
/\d{3,}/ 匹配3个数字以上
/([A-Z]\d{4})/ 匹配首位是大写字母,后面4个是数字的字符
3. 下面我们就来具体看几个例子吧:
/Mrs?\.?/
上面匹配的是:M后面是字符r, 后面是0或1个字符s, 在后面是0或1个字符"." , 匹配Mr、Mrs、Mr.、Mrs.
/<\s*\/\s*p\s*>/
上面可以匹配:
</p>, </ p>,</p >,< /p>
4. 贪婪量词和不贪婪量词
量词*(零个或多个)和+(一个或多个)是贪婪的,它们会匹配尽可能多的字符,我们可以在*和+后面加一个?,使它成为非贪婪量词
irb(main):001:0> string = "abcdefGhigkGmnGop"
=> "abcdefGhigkGmnGop"
irb(main):002:0> match = /.+G/.match(string) #+会贪婪的匹配
=> #<MatchData "abcdefGhigkGmnG">
irb(main):003:0> match[0]
=> "abcdefGhigkGmnG"
irb(main):004:0> lmatch = /.+?G/.match(string) #+?不会贪婪的匹配,找到一个就停止
=> #<MatchData "abcdefG">
irb(main):004:0> lmatch = /.+?G/.match(string) #+?不会贪婪的匹配,找到一个就停止
=> #<MatchData "abcdefG">
irb(main):005:0> lmatch[0]
=> "abcdefG"
5. 锚
锚是指必须满足一定的条件,才能继续匹配
^ 行首
$ 行尾
\A 字符串的开始
\z 字符串的结尾
\Z 字符串的结尾(不包括最后的换行符)
\b 单词边界
irb(main):001:0> string = "&&&Join@@@@"
=> "&&&Join@@@@"
irb(main):002:0> match = /\b\w+\b/.match(string)
=> #<MatchData "Join">
irb(main):003:0> match[0]
=> "Join"
6. 前视断言
前视断言表示想要知道下一个指定的是什么,但并不匹配
1. 肯定的前视断言(?=)
irb(main):001:0> string = "123 456 789.032"
=> "123 456 789.032"
irb(main):002:0> match = /\d+(?=\.)/.match(string)
=> #<MatchData "789">
irb(main):003:0> match[0]
=> "789"
假设我们想要匹配一个数的序列,该序列以一个圆点结束,但并不想把圆点作为模式匹配的一部分
2. 否定的前视断言(?!)
irb(main):004:0> string = "123 456 789.032"
=> "123 456 789.032"
irb(main):005:0> match = /\d+(?!\.)/.match(string)
=> #<MatchData "123">
irb(main):006:0> match[0]
=> "123"
7. 修饰语
修饰语位于正则表达式最结束正则表达式的正斜杠的后面
1. i 使正则表达式对大小写不敏感,看个例子
irb(main):001:0> string = "AbCdefG"
=> "AbCdefG"
irb(main):002:0> match = /abc/i.match(string)
=> #<MatchData "AbC">
irb(main):003:0> match[0]
=> "AbC"
irb(main):004:0> match = /abc/.match(string)
=> nil
2. m 使得正则表达式可以和任何字符匹配,包括换行符,通常情况下圆点通配符不匹配换行符 我们来看个稍微复杂点的
irb(main):001:0> string = <<EOF #定义一个多行的字符串
irb(main):002:0" <div id="xx">
irb(main):003:0" <p></p>
irb(main):004:0" </div>
irb(main):005:0" EOF
=> "<div id=\"xx\">\n<p></p>\n</div>\n"
irb(main):006:0> match = /<div.+<\/div>/m.match(string) #加上m就可以匹配多行
=> #<MatchData "<div id=\"xx\">\n<p></p>\n</div>">
irb(main):007:0> match[0]
=> "<div id=\"xx\">\n<p></p>\n</div>"
irb(main):008:0> match = /<div.+<\/div>/.match(string) #不加上m就匹配不到
=> nil
8. 现有如下格式字符串:
str = “”www.google.com">I love ruby"
现要使str变为I love ruby怎么做?
就是获得去掉a标签后的内容.请看下面:
irb(main):001:0> str = '<a href="www.google.com">I love ruby</a>'
=> "<a href=\"www.google.com\">I love ruby</a>"
irb(main):002:0> str.sub(/<a.*?>(.*?)<\/a>/,'\1')
=> "I love ruby"
9. 还有gsub的用法:
irb(main):001:0> a = "i love ruby"
=> "i love ruby"
irb(main):002:0> a.gsub(/ruby/,'java')
=> "i love java"
irb(main):002:0> a.gsub(/ruby/,'java')
=> "i love java"
10. 本节的结束,我们来看一个变态的gsub夹杂这scan的用法:
str = "<li>a</li>" + "<li>1</li>" + "<li>2</li>" + "<li>3</li>" + "<li>b</li>" + "<li>c</li>" + "<li>d</li>"
result = str.gsub(/<li>.+?<\/li>/) do |match|
del = false
match.scan(/<li>(\d+)<\/li>/) do |num|
del = true
end
if del
""
else
match
end
end
p result #"<li>a</li><li>b</li><li>c</li><li>d</li>" 可以看到带数字的li被干掉了.不可思议!
** 常用和不常用的Ruby正则表达式
1. 1> 用户注册名
/^[a-z0-9_-]{3,16}$/
以字母开头, 包含字母,数字,_,-的3-16个字符
2> 用户密码
/^[a-z0-9_-]{6,18}$/
跟第一个一样,除了字符数
3> 十六进制数
/^#?([a-f0-9]{6}|[a-f0-9]{3})$/
以#开头或者不以#开头, 后面跟 6个字符(a-f或者0-9) 或者 3个字符(a-f或者0-9)
4> 匹配一个Slug(啥叫Slug?看看上面地址栏里的那一陀)
/^[a-z0-9-]+$/
很简单,多个字母(a-z),数字(0-9),和-组成的字符
5> 匹配Email地址,这个用途太广泛了
/^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
6> 匹配Url
/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
7> 匹配IP地址
num = /\d|[01]?\d\d|2[0-4]\d|25[0-5]/
exp = /^(#{num}\.){3}#{num}$/
num是每个数字串的匹配模式, exp就是最终的RegExp了,下面是演示:
irb(main):001:0> num = /\d|[01]?\d\d|2[0-4]\d|25[0-5]/
=> /\d|[01]?\d\d|2[0-4]\d|25[0-5]/
irb(main):002:0> exp = /^(#{num}\.){3}#{num}$/
=> /^((?-mix:\d|[01]?\d\d|2[0-4]\d|25[0-5])\.){3}(?-mix:\d|[01]?\d\d|2[0-4]\d|25[0-5])$/
irb(main):003:0> exp.match("192.168.1.22")
=> #<MatchData "192.168.1.22" 1:"1.">
8> 匹配时间/日期类型(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
上面的已经解释的很清楚了,我还是觉得一个一个串拼起来比较清楚
9> 解决一个问题, 给了一个ip地址:192.168.1.1,想要转为Array: [192,168,1,1]
irb(main):001:0> "192.168.1.1".scan(/(\d+)\.?/)
=> [["192"], ["168"], ["1"], ["1"]]
irb(main):002:0> "192.168.1.1".scan(/(\d+)\.?/).flatten
=> ["192", "168", "1", "1"]
irb(main):003:0> "192.168.1.1".scan(/(\d+)\.?/).flatten.map{|n| n.to_i }
=> [192, 168, 1, 1]
irb(main):001:0> "192.168.1.1".split(".").map{|x| x.to_i}
=> [192, 168, 1, 1]
# thanks Hooopo for this
======================================================================================================================
正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
匹配双字节字符(包括汉字在内):[^\x00-\xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
匹配空白行的正则表达式:\n\s*\r
评注:可以用来删除空白行
匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? />
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
匹配首尾空白字符的正则表达式:^\s*|\s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注:表单验证时很实用
匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求
匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用
匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
评注:匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始
匹配中国邮政编码:[1-9]\d{5}(?!\d)
评注:中国邮政编码为6位数字
匹配身份证:\d{15}|\d{18}
评注:中国的身份证为15位或18位
匹配ip地址:\d+\.\d+\.\d+\.\d+
评注:提取ip地址时有用
匹配特定数字:
^[1-9]\d*$ //匹配正整数
^-[1-9]\d*$ //匹配负整数
^-?[1-9]\d*$ //匹配整数
^[1-9]\d*|0$ //匹配非负整数(正整数 + 0)
^-[1-9]\d*|0$ //匹配非正整数(负整数 + 0)
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匹配正浮点数
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匹配负浮点数
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匹配浮点数
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正
匹配特定字符串:
^[A-Za-z]+$ //匹配由26个英文字母组成的字符串
^[A-Z]+$ //匹配由26个英文字母的大写组成的字符串
^[a-z]+$ //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$ //匹配由数字和26个英文字母组成的字符串
^\w+$ //匹配由数字、26个英文字母或者下划线组成的字符串
评注:最基本也是最常用的一些表达式
// 手机号验证
function isRightMobileNumber(s){
var patrn=/^0?1(4\d|3\d|5[012356789]|8[012356789])\d{8}$/;
if (!patrn.exec(s)) return false
return true
}
相关推荐
2. **pcre-6.6.tar.gz**: PCRE(Perl Compatible Regular Expressions)是Perl兼容的正则表达式库,为编程语言提供强大的文本匹配功能。Ruby在处理字符串和正则表达式时会用到这个库。 3. **lighttpd-1.4.11.tar.gz...
They are now standard features in a wide range of languages and popular tools, including Perl, Python, Ruby, Java, VB.NET and C# (and any language using the .NET Framework), PHP, and MySQL....
在编程语言Ruby中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于模式匹配、搜索与替换字符串等功能。Ruby采用`//`作为正则表达式的边界标记,使得其正则表达式的语法更加清晰且易于理解。本文将...
在Ruby编程语言中,正则表达式(Regular Expression)是一种强大的文本处理工具,被广泛应用于字符串搜索与替换、数据验证以及模式匹配等场景。本篇文章将深入探讨Ruby中常用的正则表达式规则及其应用场景,帮助读者...
在Ruby编程语言中,正则表达式(Regular Expression)是一种强大的工具,用于处理字符串和文本数据,特别是查找、替换和提取特定模式。标题提到的"一个漂亮的正则表达式用于查找和提取这些文件中的相对URL"是针对...
- **正则表达式(Regular Expression)**:强大的文本匹配工具,用于字符串搜索和替换。 - **块和迭代器(Block and Iterator)**:Ruby中的块是一种匿名函数,常与迭代器一起使用,实现对集合的高效操作。 - **文件...
They are now standard features in a wide range of languages and popular tools, including Perl, Python, Ruby, Java, VB.NET and C# (and any language using the .NET Framework), PHP, and MySQL. ...
This revised edition covers the regular expression flavors used by C#, Java, JavaScript, Perl, PHP, Python, Ruby, and VB.NET. You’ll learn powerful new tricks, avoid flavor-specific gotchas, and save...
随着计算机技术的发展,正则表达式已经成为许多编程语言的标准特征之一,如Perl、Python、Ruby、Java、VB.NET、C#(通过.NET框架)、PHP和MySQL等。 #### 本书价值与目标读者 - **未接触过正则表达式的读者**:...
这是将Ruby的正则表达式转换为JavaScript风格的Ruby宝石。 与,它可以处理Ruby的正则表达式功能,并且如果仍然存在任何不兼容之处,它会返回以表明它们。 这意味着您将有更好的机会来翻译正则表达式,并且如果...
[Ruby袖珍参考手册].(Ruby.Pocket.Reference).Michael.Fitzgerald.文字版.pdf [SQL袖珍参考手册(第3版)].(SQL.Pocket.Guide).Jonathan.Gennick.文字版.pdf [vi和Vim编辑器袖珍参考手册(第2版)].(vi.and.Vim.Editors....
正则表达式(Regular Expression,通常简称为 regex)是一套用于文本处理的规则,通过指定字符集合及相应规则来实现对字符串的匹配、查找、替换等操作。Ruby是一种简单、面向对象的编程语言,提供了强大的正则表达式...
正则表达式(Regular Expression)是一种强大的模式匹配工具,在多种编程语言中都有广泛的应用。Ruby作为一门灵活且易于使用的编程语言,其内置的正则表达式功能更是强大且便捷。本文将详细介绍Ruby中正则表达式的...
Presently employed as a Software Engineer at DRW Trading, Ben is focused on development practices that support rapid and regular delivery of well crafted software. You can follow Ben on Twitter at ...
Ruby表情符号正则表达式 :gem_stone: 一组Ruby正则表达式,用于匹配Unicode Emoji符号。背景这是基于 Javascript软件包的出色工作。 emoji-regex是根据Unicode联盟的数据巧妙地组合而成的。 本文提供的正则表达式...