- 浏览: 209310 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (391)
- java (18)
- python (3)
- ruby (4)
- linux (48)
- 网络 (9)
- 前端 (2)
- 社会、文化、哲学、人生、百态 (0)
- 工具 (10)
- 下载 (0)
- 常用地址 (0)
- tracert (0)
- mysql (8)
- 开源相关收藏 (1)
- 模块查看依懒 (1)
- watch使用 (1)
- Tcpdump (2)
- easy_install安装 (1)
- 构造redis批量删除脚本 (1)
- MYSQL 性能测试 (1)
- JAVA code encode utf-8 (1)
- linux nginx awk 实时 每妙 (1)
- mkpasswd (1)
- spring security oauth (1)
- jmap dump java memory Analyzer (1)
- JAVA DUMP (1)
- swap linux 过高 解决 (1)
- SWAP (1)
- jmap jstat jstack dump (1)
- java jconsole 的使用 (1)
- git 常用 (1)
- MYSQL 索引 动态 唯一 (1)
- TCP 三次握手 四次挥手 (1)
- linux date (1)
- 删除 空行 注释行 (1)
- maven3 yum linux install repository (1)
- linux git 搭建 (1)
- linux sar eth1 查看 流量 (1)
- sar (1)
- netstat ip 过滤 常用脚本 (1)
- Tcpdump 包分析网络连接过程 (1)
- net ipv4 tcp time wait tw recycle (0)
- /etc/sysctl.conf linux 网络 配置 (1)
- ss 网络连接查看 (比netstat 快很多,实时性牺牲) (1)
- MYSQL 关键字 (1)
- Linux 下多核CPU知识 (1)
- top (1)
- 令牌 证书 (1)
- mysql unix timestamp (1)
- 端口扫描 nc nmap (1)
- 204 http code 状态码 (1)
- ss -s ss -l (1)
- linux 常用 curl (1)
- linux sed 替换 换行 (1)
- centos yum install rpm install (1)
- spring-mvc源码解读 (1)
- 使用iftop查看实时的网络流量 (0)
- linux 命令 expect (1)
- HTTP (1)
- openssl ddif 加密 (1)
- iptables 详解 (1)
- python 虚拟化 VirtualEnv virtualenvwrapper (1)
- nginx (2)
- more less 实用技巧 (1)
- linux nginx (2)
- linux curl https ssl 证书 ca (1)
- openssl (1)
- php mysql linux (1)
- linux 虚拟机 虚拟 xen (0)
- linux 虚拟机 虚拟 xen kvm (1)
- linux perl 单行执行技巧 (1)
- mysql 查看库占用空间 表查用空间 (1)
- linux tcpdump (1)
- maven (1)
- sun.misc.Unsafe (1)
- OpenSSL生成证书 (1)
- http://blog.csdn.net/zzulp/article/details/8018751 (1)
- maven 本地 jar dependency (1)
- 计算JAVA代码行数最简单命令 sed (1)
- 常用的证书格式转换 rsa eg (1)
- 加密 解密 签名 (1)
- 分析jar包冲突 (1)
- 使用JMockit编写java单元测试 (1)
- Linux 技巧:让进程在后台可靠运行的几种方法 (1)
- 环境变量控制 (1)
- 5+ 个 tar 命令的用法,附示例 (1)
- scp自动输入密码 (1)
- ps axo pid (1)
- ppid (1)
- comm (1)
- pmem (1)
- lstart|grep mysql (0)
- lstart (1)
- etime|grep mysql (1)
- UML类图字少好理解 (1)
- HTTP经典文章 (1)
- git (1)
- Git常用命令 (1)
- LINUX 系统被攻击的分析过程 (1)
- NIO (1)
- LINUX 操作快捷键使用 (1)
- openSSL命令、PKI、CA、SSL证书原理 (1)
- shell (2)
- 转载 (1)
- mysqldump 可以直接dump->xml (1)
- VIM比较全面的文章 (1)
- eclipse regex 正则表达式 (1)
- synchronized (1)
- 锁 (1)
- java 正则表达式 regex (1)
- Reference Queue 引用 源码 (1)
- spring aop 源码 分析 (1)
- java @Cache @Transaction 注解 (1)
- spring aop (1)
- spring jdk proxy cglib 动态代理 性能比较 (1)
- spring proxy private public 代理限制 (1)
- spring transaction aop 事务 (1)
- spring autowire 注解注入 (1)
- 桥接 NAT NAT地址转换 内部网络 虚拟网络 (1)
- spring-web-mvc 源码解读 之 RequestMappingHandlerMapping (1)
- find atime mtime ctime -n n +n (1)
- android studio 快捷键初探 (1)
- android 源码阅读的计划 (1)
- 计算机网络学习-VLAN (1)
- sed 高级 合并行 (1)
- CAP 一致性 可用性 分布式容错性 (1)
- android lib so 库文件 (0)
- android lib so 库文件 移植 (1)
- android 不错的博文 (1)
- sourceinsight 源码 阅读 (1)
- Android Tab UI (1)
- 诗 (1)
- mysql 批处理 (0)
- netty 堆外内存 DirectByteBuffer (1)
- netty 并发 百万 推送 (1)
- Linux操作系统中内存buffer和cache的区别 (1)
- maven intellij target bytecode version (1)
- linux sleep()的实现原理 (1)
- android (2)
- javadoc 代码注释规范 (1)
- spring 自动注入bean auto (1)
- Photoshop CS6常用快捷键 (1)
- 股票 数据 机器 分析 (1)
- 批处理 (1)
- mysql -e (1)
- char (1)
- Unicode (1)
- 编码 (1)
- utf8 (1)
- utf-8 (1)
- utf16 (1)
- utf-16 (1)
- IntelliJ IDEA (1)
- ide (1)
- idea (1)
- intellij (1)
- 文件 (1)
- 目录 (1)
- 源代码 (1)
- CountDownLatch (1)
- CyclicBarrier (1)
- Semaphore (1)
- spring (1)
- linux 查看不同进制文件 (1)
- WebMvcConfigurationSupport (1)
- sdkman工具的使用 (1)
- http header (1)
- LINUX系统优化 (1)
最新评论
-
gelongmei:
威武我大酒神
shell脚本不换行刷新数据
# \d
# 数字。即[0-9]
puts "aaa0" =~ /\d/ # 3 匹配数字
puts /\d/ =~ "abc2" # 3
puts "kkmm1" =~ /\d/ # 4 匹配数字
# [\u{4e00}-\u{9fff}]
# 中文
puts "abcdef我熬啊" =~ /[\u{4e00}-\u{9fff}]/u #6 匹配中文
puts "abcdef我熬啊" =~ /\p{Han}/u # 6
# \w
# 字母和数字。等同于[0-9A-Za-z]。
puts "-=123a" =~ /\w/ # 2 匹配字母
puts "-=a3a" =~ /\w/ # 2 匹配字母
# \s
# 空字符。相当于[ \t\n\r\f]
puts "aaa bbb" =~ /aa\s/ # 1
puts "aaa bbb" =~ /\s/ # 3
# ^
# 行首。与字符串的头部或换行符之后的位置相匹配。
# \A
# 字符串头部。与^不同的是,它不受有无换行符的影响 。
puts "abcd\nefghg" =~ /^e/ # 5
puts "1\n2\n3\n4" =~ /^3/ # 4
puts "1\n2\n3\n4" =~ /\A1/ # 0
puts "abcd\nefghg" =~ /\A/ # 0
# $
# 行尾。与字符串的尾部或换行符之前的位置相匹配。不包括换行符本身。
# \Z
# 字符串尾部。若字符串以换行符结尾,则匹配换行符前的位置。
puts "abcd\nefghg" =~ /g$/ # 9
puts "1\n2\n3\n4" =~ /3$/ # 4
puts "1\n2\n3\n4" =~ /4\Z/ # 6
puts "abcd\nefghg" =~ /\Z/ # 10
# .
# 匹配除换行符以外的任意一个字符。使用正则表达式选项 m(多行模式。请参考正则表达式字面值) 时,则匹配包括换行符在内的任意一个字符。在匹配多字节字符的正则表达式中,则匹配一个字(非单字节)。
# 当遇到不完整的多字节字符的一部分(无法判断该字符是多字节字符?二进制?还是ASCII)时,也不会匹配。
puts /./e =~ "CV--aa" # 0
puts /./ =~ "あ" # 0
/a.*b/.match("a123bcab") #=><MatchData "a123bcab:>
# \b
# 在字符范围描述符之外时表示词边界(匹配从\w到\W)。在字符范围描述符之内时表示退格符(0x08)。
puts "232342eaaabbbddd43452532543" =~ /b/ # 10
# 从头取出3位数字(数字必须相连)。
str = "123456 789"
puts str.scan(/\G\d\d\d/) {|m| p m }
# [ ]
# 指定字符范围。请参考字符范围
puts "1445345abc" =~ /[a-z]/
# *
# 前面元素至少出现0次。尽可能匹配较长的部分。
# *?
# 负责指定数量(quantifiers)。表示前面元素至少出现0次(尽量匹配短的部分)
# +
# 负责指定数量(quantifiers)。表示前面元素至少出现1次
# +?
# 负责指定数量(quantifiers)。表示前面元素至少出现1次(尽量匹配短的部分)
# {m}
# {m,}
# {m,n}
# 指定元素重复出现的次数(interval quantifier)。分别表示前面元素重复出现
# m 次
# 至少 m 次
# 至少 m 次,至多 n 次
# {,n} 或 {,} 将导致匹配失败。
str = "foofoofoo"
p str[/(foo){1}/] # => "foo"
p str[/(foo){2,}/] # => "foofoofoo"
p str[/(foo){1,2}/] # => "foofoo"
# 正则表达式 ?, *, + 分别等同于 {0,1}, {0,} {1,} 。
# {m}?
# {m,}?
# {m,n}?
# 指定元素重复出现的次数(interval quantifier)。分别表示前面元素重复出现
# m 次
# 至少 m 次
# 至少 m 次,至多 n 次
# (尽量匹配短的部分)。
str = "foofoofoo"
p str[/f{1}?/] # f
p str[/(o){2,8}?/] # f
# ?
# 负责指定数量(quantifiers)。表示前面元素至多出现1次。
# ??
# 负责指定数量(quantifiers)。表示前面元素至多出现1次(尽量匹配短的部分)
# |
# 选择(alternative)。
# ( )
# 正则表达式的群组化。与括号中的正则表达式相匹配的字符串将被保存下来,供后方参考使用。
p /(ab)+/=~"123abab"
p /(ab)+/.match("123abab") #=><MatchData "abab" 1:"ab">
# \1, \2 ... \n
# 后方参考(back reference)。请参考后方参考。
p /((foo)bar)foobarfoo/
re = /(foo|bar|baz)\1/
p re =~ 'foofoo' # => 0
p re =~ 'barbar' # => 0
p re =~ 'bazbaz' # => 0
p re =~ 'foobar' # => nil
# (?# )
# 注释。括号中的任意字符串将被忽视。
# (?: )
# 不具备后方参考功能的群组化。它不为\1,\2(或$1,$2)提供服务,是一种单纯的群组功能。
/(cba)/ =~ "abccba"
p $1 # cba
/(?:abc)/ =~ "abc"
p $1
1.建立正则表达式
使用”//” reg=/ru\/by/ 需要对转义字符转义
使用类方法Regexp.new reg=Regexp.new(“ru/by”) 不需要对转义字符转义
使用%r reg=%r(ru/by) 不需要对转义字符转义
2.正则表达式的一般匹配
/ruby/ =~ "ruby string"
#=>0 返回匹配成功的起始位置
/ruby/.match("string
# 返回匹配成功的字符串
3.匹配行首行尾和字符串首尾
若字符串中有换行符,行尾就是换行符的前面
^ 匹配行首
/^ruby/=~"rubystring" #=>0
/^ruby/=~"string\nruby" #=>7
$ 匹配行尾
/ruby$/=~"stringruby" #=>6
/ruby$/=~"stringruby/string" #=>6
\A 匹配字符串首
/\Aruby/=~"rubystring" #=>0
/\Aruby/=~"string\nrubystring" #=>nil
\Z 匹配字符串尾
/ruby\Z/=~"string\nruby" #=>7
/ruby\Z/=~"stringruby\nstring" #=>nil
4.指定匹配范围和多选
[ab] 匹配a或b
/[ab]/=~"stringa" #=>6
[adf] 匹配a、d或f
/[adf]/=~"stringd" #=>6
[a-z] 匹配a到z
/[a-z]/=~"123r" #=>3
[A-Za-z] 匹配A到Z和a到z
/[A-Za-z]/=~"123D321" #=>3
[0-9] 匹配0到9
/[0-9]/=~"abc4ef" #=>3
在[ ]内加入^表示匹配除括号内指定的字符外
[^abc] 匹配除abc之外的字符
/[^abc]/=~"abccb" #=>nil
/[^abc]/=~"acdf" #=>2
使用”|”来添加候选字符
/12a|b/.match("123bc") #=gt;<MatchData "12b">
/12a|b|c/.match("123cd") #=gt;<MatchData "12c">
5.匹配任意字符
匹配除换行符外地任意字符
/./=~"abc" #=>0
6.反斜杠字母
\s 匹配空白、换行符、定位字符、换页符
/a\sc/=~"abca c" #=>3
\S 匹配除空白、换行符、定位符、换页符之外的字符
/a\Sc/=~"a\ncabc" #=>3
\d 匹配数字
/a\dc/=~"abca1c" #=>3
\D 匹配除数字之外的字符
/a\Dc/=~"a1cabc" #=>3
\w 匹配数字、字母和"_"
/a\wc/=~"a&cabc" #=>3
\W 匹配除数字、字母和"_"之外的字符
/a\Wc/=~"abca&c" #=>3
\b 匹配单词的开始或结尾
/\bis/=~"this ist" #=>5
/is\b/=~"this ist" #=>2
\B 与\b相对
/\Bis/=~"this ist" #=>2
/is\B/=~"this ist" #=>5
7.转义字符的转义
在转义字符”^”,”$”,”["等前面加上"\",就能对转义字符进行转义来表示它自己
/abc\$/=~"abc" #=>nil
/abc\$/=~"abc$" #=>0
通过quote方法来将转义字符变成普通字符
reg1=Regexp.new("a*b")
reg2=Regexp.new(Regexp.quote("a*b"))
reg1=~"123a*b" #=>nil
reg2=~"123a*b" #=>3
8.反复的匹配
* 出现0次或以上
/a*b/.match("123aaab") #=><MatchData "aaab">
/a*b/.match("123b") #=><MatchData "b">
+ 出现1次或以上
/a+b/.match("123aaab") #=><MatchData "aaab">
/a+b/.match("123b") #=>nil
/a+b/.match("123ab") #=><MatchData "ab">
? 出现0次或1次
/a?b/=~"123aaab" #=>5
/^a?b/=~"aaab" #=>nil
/.?b/.match("123b") #=><MatchData "3b">
ruby的正则表达式匹配时是贪婪匹配,即匹配时尽可能匹配更多的字符
/a.*b/.match("a123bcab") #=><MatchData "a123bcab:>
可通过添加"?"来变成不贪婪匹配
*? 0次或以上的不贪婪匹配
+? 1次或以上的不贪婪匹配
/a.*?b/.match("a123bcab") #=><MatchData "a123b">
使用()群组来反复
/(ab)*/=~"123abab" #=>0
/(ab)*/.match("123abab") #=><MatchData "" 1:nil>
/(ab)+/=~"123abab" #=>3
/(ab)+/.match("123abab") #=><MatchData "abab" 1:"ab">
使用{}来为制定的字符取得多次匹配
/a{n}/ 匹配n个a
/a{3}/.match("123aaab") #=><MatchData "aaa">
/a{n,} 匹配n或n以上个a
/a{3,}/.match("123aaaab") #=><MatchData "aaaa">
/a{n,m} 匹配n到m个a
/a{1,3}b/=~"123b" #=>nil
/a{1,3}b/=~"123ab" #=>3
/a{1,3}b/=~"123aab" #=>3
/a{1,3}b/=~"123aaab" #=>3
/a{1,3}b/=~"123aaaab" #->nil
9.正则表达式的选项
通过直接在添加"/.../"后面,如/Ab/i
i 忽略大小写
/ab/i=~"12AB" #=>2
m 多行匹配,能让"."匹配换行符
/a.b/m=~"12a\nbc" #=>2
x 忽略空白、换行符,并忽略"#"后面的字符,这时可使用#来添加注释了
/a b/=~"12ab" #=>nil
/a b/x=~"12ab" #=>2
/a b#def/x.match("12abdef") #=><MatchData "ab">
s,e,u,n 指定字符编码,s是Shift-JIS,e是EUC-JP,
u是UTF-8,n是none即不考虑字符编码
通过在字符前面添加选项,选项后面的字符都被选项影响,
而选项前面的字符则不受影响
(?i)
/A(?i)bc/=~"ABC" #=>0
/A(?i)bc/=~"abc" #=>nil
/A(?i)b(?-i)c/=~"AbC #=>nil
/A(?i)b(?-i)c/=~"ABc" #=>0
类似还有(?m),(?x),(?-i)表示不能忽略大小写,
(?-m)表示不能忽略换行符,(?-x)表示不能忽略空白
通过将字符串写入选项内
(?i:)
/A(?i:bc)/=~"ABC" #=>0
同样,还有(?-i:),(?m:),(?-m:),(?x:),(?-x:)
10.添加注释
除了通过上面所讲,使用x选项来添加注释,还可以使用(?#)
/ab(?#def)/=~"123ab" #=>3
/\d-(?#这里的"-"不是指范围)\d/=~"ab1-2" #=>2
11.回溯参照(backreference,反向引用)
回溯参照用来取出字符串中匹配成功的一部分
与正则表达式中的()中所匹配的字符串可用$1,$2,,$3……来取出
取出顺序是从左往右,从外向内
/(a)(.)(b)/.match("123aeb") #=><MatchData "acb" 1:"a" 2:"e" 3:"b">
p $1 #=>"a"
p $2 #=>"e"
p $3 #=>"c"
/((.)(a))/.match("123abc") #=><MatchData "3a" 1:"3a" 2:"3" 3:"a">
p $1 #=>"3a"
p $2 #=>"3"
p $3 #->"a"
取出与正则表达式所匹配的字符,匹配的字符的前面,匹配字符的后面
分别用$&,$`(1旁边),$'
/ab/=~"123ab456" #=>3
p $& #=>"ab"
p $` #=>"123"
p $' #=>"456"
取出MatchData,用$~
/(a)b/=~"123ab" #=>3
p $` #=>"123"
p $' #=>""
p $& #=>"ab"
p $~ #=><MatchData "ab" 1:"a">
用形如"\num"来匹配群组1,群组2,群组3……群组num的字符
/a(b)\1/=~"abc" #=>nil
/a(b)\1/=~"abb" #=>0
/(a)(b)\1\2/=~"abaa" #=>nil
/(a)(b)\1\2/.match("123abab") #=><MatchData "abab" 1:"a" 2:"b">
/(a)(b)\2/=~"abb" #=>0
/((a)(b))\1/.match("123abab") #=><MatchData "abab" 1:"ab" 2:"a" 3:"b">
/(a|b)\1/=~"ab" #=>nil
/(a|b)\1/=~"ba" #=>nil
/(a|b)\1/=~"aa" #=>0
/(a|b)\1/=~"bb" #=>0
若要在\num后面添加数字,则必须得给\num添加括号
/a(b)(\1)2/=~"ab12" #=>nil
/a(b)(\1)2/=~"abb2" #=>0
使用索引
mat1=/.a/.match("123a") #=><MatchData "3a">
p mat1[0] #=>”3a”
p mat1[1] #nil
mat2=/(.)a/.match(“123a”) #=><MatchData “3a” 1:”3″>
p mat2[0] #=>”3a”
p mat2[1] #=>”3″
p mat2[2] #=>nil
若只想有群组的功能,而没有回溯参照的功能,则可以使用(?:)
/(a)(?:b)(c)/.match(“123abcd”) #=><MatchData “abc” 1:”a” 2:”c”>
12.(?!exp)和(?=exp)
(?!exp) 匹配后缀不是exp
/ab(?!c)/=~"abc" #=>nil
/ab(?!c)/=~"abe" #=>0
(?=exp) 匹配后缀为exp
/ab(?=c)/=~"abc" #=>0
/ab(?=c)/=~"abe" #=>nil
13.sub方法和gsub方法
sub方法和gsub方法都是用来取代字符串中字符的方法,
第一个参数指定匹配样式,第二个参数指定想要代入的字符串。
sub方法只会取代第一个匹配成功的字符串,
而gsub方法会取代所有匹配成功的字符串
sub方法,sub!方法
str="abc\n123\456"
str.sub(/\n/,'d') #=>"abcd123\n456"
gsub方法,gsub!方法
str="abc\n123\n456"
str.gsub(/\n/,'d') #=>"abcd123d456"
sub方法和gsub方法也可以传入区块
str="ab12ac34ad"
str.gsub(/a./){|mat|
print "string ",mat,"\n"
}
#=>
string ab
string ac
string ad
14.scan方法
scan方法会查找字符串中所有匹配的字符,并以数组返回
"12ab34ac56ad".scan(/a./) #=>["ab","ac","ad"]
scan方法也可以传入区块
"12ab34ac56ad".scan(/a./){|mat|
print "string ",mat,"\n"
}
#=>
string ab
string ac
string ad
当正则表达式中含有(),则匹配成功的部分会以数组的形式传入区块
"12ab34ac56ad".scan(/(a)(.)/){|mat|
print mat
}
#=>
["a","b"]
["a","c"]
["a","d"]
若区块中的变量和正则表达式中的()一样多式,则不会传入数组
"12ab34ac56ad".scan(/(a)(.)/){|m,n|
print n," after ",m,"\n"
}
#=>
b after a
c after a
d after a
15.正则表达式的条件判断
if /reg/ =~ "string"
匹配成功时的动作
else
匹配失败时的动作
end
16.# Regexp .match(text)
md = /(\d\d):(\d\d)(..)/.match("12:50am")
puts "Hour is #$1, minute #$2"
puts "Hour is #{md[1]}, minute #{md[2]}"
# Regexp .quote(text) | .escape(text)
# String .index(Regexp) | =~
17.# String .scan(Regexp)
"abcabcabz".scan(%r{abc}).each {|item| puts item} # 输出2行abc
puts "2010-11-22 2022-08-25".scan(/\d{4}-\d{2}-\d{2}/)
puts "2010-11-22 2022-08-25".scan(/(\d{4})-(\d{2})-(\d{2})/)
18.#String .slice(Regexp)
string = "Date: 2012-12-23"
regex = /\d{4}-\d{2}-\d{2}/
p string.slice(regex) # 2012-12-23
19. #String.split(Regexp)
p "2012-12-23".split(/-/)
20.# String.sub | .gsub(Regexp,String)
str = "ABDADA"
p str.sub(/A/, "*") #返回"*BDADA"
p str.gsub(/A/, "*") #返回"*BD*D*"
# 数字。即[0-9]
puts "aaa0" =~ /\d/ # 3 匹配数字
puts /\d/ =~ "abc2" # 3
puts "kkmm1" =~ /\d/ # 4 匹配数字
# [\u{4e00}-\u{9fff}]
# 中文
puts "abcdef我熬啊" =~ /[\u{4e00}-\u{9fff}]/u #6 匹配中文
puts "abcdef我熬啊" =~ /\p{Han}/u # 6
# \w
# 字母和数字。等同于[0-9A-Za-z]。
puts "-=123a" =~ /\w/ # 2 匹配字母
puts "-=a3a" =~ /\w/ # 2 匹配字母
# \s
# 空字符。相当于[ \t\n\r\f]
puts "aaa bbb" =~ /aa\s/ # 1
puts "aaa bbb" =~ /\s/ # 3
# ^
# 行首。与字符串的头部或换行符之后的位置相匹配。
# \A
# 字符串头部。与^不同的是,它不受有无换行符的影响 。
puts "abcd\nefghg" =~ /^e/ # 5
puts "1\n2\n3\n4" =~ /^3/ # 4
puts "1\n2\n3\n4" =~ /\A1/ # 0
puts "abcd\nefghg" =~ /\A/ # 0
# $
# 行尾。与字符串的尾部或换行符之前的位置相匹配。不包括换行符本身。
# \Z
# 字符串尾部。若字符串以换行符结尾,则匹配换行符前的位置。
puts "abcd\nefghg" =~ /g$/ # 9
puts "1\n2\n3\n4" =~ /3$/ # 4
puts "1\n2\n3\n4" =~ /4\Z/ # 6
puts "abcd\nefghg" =~ /\Z/ # 10
# .
# 匹配除换行符以外的任意一个字符。使用正则表达式选项 m(多行模式。请参考正则表达式字面值) 时,则匹配包括换行符在内的任意一个字符。在匹配多字节字符的正则表达式中,则匹配一个字(非单字节)。
# 当遇到不完整的多字节字符的一部分(无法判断该字符是多字节字符?二进制?还是ASCII)时,也不会匹配。
puts /./e =~ "CV--aa" # 0
puts /./ =~ "あ" # 0
/a.*b/.match("a123bcab") #=><MatchData "a123bcab:>
# \b
# 在字符范围描述符之外时表示词边界(匹配从\w到\W)。在字符范围描述符之内时表示退格符(0x08)。
puts "232342eaaabbbddd43452532543" =~ /b/ # 10
# 从头取出3位数字(数字必须相连)。
str = "123456 789"
puts str.scan(/\G\d\d\d/) {|m| p m }
# [ ]
# 指定字符范围。请参考字符范围
puts "1445345abc" =~ /[a-z]/
# *
# 前面元素至少出现0次。尽可能匹配较长的部分。
# *?
# 负责指定数量(quantifiers)。表示前面元素至少出现0次(尽量匹配短的部分)
# +
# 负责指定数量(quantifiers)。表示前面元素至少出现1次
# +?
# 负责指定数量(quantifiers)。表示前面元素至少出现1次(尽量匹配短的部分)
# {m}
# {m,}
# {m,n}
# 指定元素重复出现的次数(interval quantifier)。分别表示前面元素重复出现
# m 次
# 至少 m 次
# 至少 m 次,至多 n 次
# {,n} 或 {,} 将导致匹配失败。
str = "foofoofoo"
p str[/(foo){1}/] # => "foo"
p str[/(foo){2,}/] # => "foofoofoo"
p str[/(foo){1,2}/] # => "foofoo"
# 正则表达式 ?, *, + 分别等同于 {0,1}, {0,} {1,} 。
# {m}?
# {m,}?
# {m,n}?
# 指定元素重复出现的次数(interval quantifier)。分别表示前面元素重复出现
# m 次
# 至少 m 次
# 至少 m 次,至多 n 次
# (尽量匹配短的部分)。
str = "foofoofoo"
p str[/f{1}?/] # f
p str[/(o){2,8}?/] # f
# ?
# 负责指定数量(quantifiers)。表示前面元素至多出现1次。
# ??
# 负责指定数量(quantifiers)。表示前面元素至多出现1次(尽量匹配短的部分)
# |
# 选择(alternative)。
# ( )
# 正则表达式的群组化。与括号中的正则表达式相匹配的字符串将被保存下来,供后方参考使用。
p /(ab)+/=~"123abab"
p /(ab)+/.match("123abab") #=><MatchData "abab" 1:"ab">
# \1, \2 ... \n
# 后方参考(back reference)。请参考后方参考。
p /((foo)bar)foobarfoo/
re = /(foo|bar|baz)\1/
p re =~ 'foofoo' # => 0
p re =~ 'barbar' # => 0
p re =~ 'bazbaz' # => 0
p re =~ 'foobar' # => nil
# (?# )
# 注释。括号中的任意字符串将被忽视。
# (?: )
# 不具备后方参考功能的群组化。它不为\1,\2(或$1,$2)提供服务,是一种单纯的群组功能。
/(cba)/ =~ "abccba"
p $1 # cba
/(?:abc)/ =~ "abc"
p $1
1.建立正则表达式
使用”//” reg=/ru\/by/ 需要对转义字符转义
使用类方法Regexp.new reg=Regexp.new(“ru/by”) 不需要对转义字符转义
使用%r reg=%r(ru/by) 不需要对转义字符转义
2.正则表达式的一般匹配
/ruby/ =~ "ruby string"
#=>0 返回匹配成功的起始位置
/ruby/.match("string
# 返回匹配成功的字符串
3.匹配行首行尾和字符串首尾
若字符串中有换行符,行尾就是换行符的前面
^ 匹配行首
/^ruby/=~"rubystring" #=>0
/^ruby/=~"string\nruby" #=>7
$ 匹配行尾
/ruby$/=~"stringruby" #=>6
/ruby$/=~"stringruby/string" #=>6
\A 匹配字符串首
/\Aruby/=~"rubystring" #=>0
/\Aruby/=~"string\nrubystring" #=>nil
\Z 匹配字符串尾
/ruby\Z/=~"string\nruby" #=>7
/ruby\Z/=~"stringruby\nstring" #=>nil
4.指定匹配范围和多选
[ab] 匹配a或b
/[ab]/=~"stringa" #=>6
[adf] 匹配a、d或f
/[adf]/=~"stringd" #=>6
[a-z] 匹配a到z
/[a-z]/=~"123r" #=>3
[A-Za-z] 匹配A到Z和a到z
/[A-Za-z]/=~"123D321" #=>3
[0-9] 匹配0到9
/[0-9]/=~"abc4ef" #=>3
在[ ]内加入^表示匹配除括号内指定的字符外
[^abc] 匹配除abc之外的字符
/[^abc]/=~"abccb" #=>nil
/[^abc]/=~"acdf" #=>2
使用”|”来添加候选字符
/12a|b/.match("123bc") #=gt;<MatchData "12b">
/12a|b|c/.match("123cd") #=gt;<MatchData "12c">
5.匹配任意字符
匹配除换行符外地任意字符
/./=~"abc" #=>0
6.反斜杠字母
\s 匹配空白、换行符、定位字符、换页符
/a\sc/=~"abca c" #=>3
\S 匹配除空白、换行符、定位符、换页符之外的字符
/a\Sc/=~"a\ncabc" #=>3
\d 匹配数字
/a\dc/=~"abca1c" #=>3
\D 匹配除数字之外的字符
/a\Dc/=~"a1cabc" #=>3
\w 匹配数字、字母和"_"
/a\wc/=~"a&cabc" #=>3
\W 匹配除数字、字母和"_"之外的字符
/a\Wc/=~"abca&c" #=>3
\b 匹配单词的开始或结尾
/\bis/=~"this ist" #=>5
/is\b/=~"this ist" #=>2
\B 与\b相对
/\Bis/=~"this ist" #=>2
/is\B/=~"this ist" #=>5
7.转义字符的转义
在转义字符”^”,”$”,”["等前面加上"\",就能对转义字符进行转义来表示它自己
/abc\$/=~"abc" #=>nil
/abc\$/=~"abc$" #=>0
通过quote方法来将转义字符变成普通字符
reg1=Regexp.new("a*b")
reg2=Regexp.new(Regexp.quote("a*b"))
reg1=~"123a*b" #=>nil
reg2=~"123a*b" #=>3
8.反复的匹配
* 出现0次或以上
/a*b/.match("123aaab") #=><MatchData "aaab">
/a*b/.match("123b") #=><MatchData "b">
+ 出现1次或以上
/a+b/.match("123aaab") #=><MatchData "aaab">
/a+b/.match("123b") #=>nil
/a+b/.match("123ab") #=><MatchData "ab">
? 出现0次或1次
/a?b/=~"123aaab" #=>5
/^a?b/=~"aaab" #=>nil
/.?b/.match("123b") #=><MatchData "3b">
ruby的正则表达式匹配时是贪婪匹配,即匹配时尽可能匹配更多的字符
/a.*b/.match("a123bcab") #=><MatchData "a123bcab:>
可通过添加"?"来变成不贪婪匹配
*? 0次或以上的不贪婪匹配
+? 1次或以上的不贪婪匹配
/a.*?b/.match("a123bcab") #=><MatchData "a123b">
使用()群组来反复
/(ab)*/=~"123abab" #=>0
/(ab)*/.match("123abab") #=><MatchData "" 1:nil>
/(ab)+/=~"123abab" #=>3
/(ab)+/.match("123abab") #=><MatchData "abab" 1:"ab">
使用{}来为制定的字符取得多次匹配
/a{n}/ 匹配n个a
/a{3}/.match("123aaab") #=><MatchData "aaa">
/a{n,} 匹配n或n以上个a
/a{3,}/.match("123aaaab") #=><MatchData "aaaa">
/a{n,m} 匹配n到m个a
/a{1,3}b/=~"123b" #=>nil
/a{1,3}b/=~"123ab" #=>3
/a{1,3}b/=~"123aab" #=>3
/a{1,3}b/=~"123aaab" #=>3
/a{1,3}b/=~"123aaaab" #->nil
9.正则表达式的选项
通过直接在添加"/.../"后面,如/Ab/i
i 忽略大小写
/ab/i=~"12AB" #=>2
m 多行匹配,能让"."匹配换行符
/a.b/m=~"12a\nbc" #=>2
x 忽略空白、换行符,并忽略"#"后面的字符,这时可使用#来添加注释了
/a b/=~"12ab" #=>nil
/a b/x=~"12ab" #=>2
/a b#def/x.match("12abdef") #=><MatchData "ab">
s,e,u,n 指定字符编码,s是Shift-JIS,e是EUC-JP,
u是UTF-8,n是none即不考虑字符编码
通过在字符前面添加选项,选项后面的字符都被选项影响,
而选项前面的字符则不受影响
(?i)
/A(?i)bc/=~"ABC" #=>0
/A(?i)bc/=~"abc" #=>nil
/A(?i)b(?-i)c/=~"AbC #=>nil
/A(?i)b(?-i)c/=~"ABc" #=>0
类似还有(?m),(?x),(?-i)表示不能忽略大小写,
(?-m)表示不能忽略换行符,(?-x)表示不能忽略空白
通过将字符串写入选项内
(?i:)
/A(?i:bc)/=~"ABC" #=>0
同样,还有(?-i:),(?m:),(?-m:),(?x:),(?-x:)
10.添加注释
除了通过上面所讲,使用x选项来添加注释,还可以使用(?#)
/ab(?#def)/=~"123ab" #=>3
/\d-(?#这里的"-"不是指范围)\d/=~"ab1-2" #=>2
11.回溯参照(backreference,反向引用)
回溯参照用来取出字符串中匹配成功的一部分
与正则表达式中的()中所匹配的字符串可用$1,$2,,$3……来取出
取出顺序是从左往右,从外向内
/(a)(.)(b)/.match("123aeb") #=><MatchData "acb" 1:"a" 2:"e" 3:"b">
p $1 #=>"a"
p $2 #=>"e"
p $3 #=>"c"
/((.)(a))/.match("123abc") #=><MatchData "3a" 1:"3a" 2:"3" 3:"a">
p $1 #=>"3a"
p $2 #=>"3"
p $3 #->"a"
取出与正则表达式所匹配的字符,匹配的字符的前面,匹配字符的后面
分别用$&,$`(1旁边),$'
/ab/=~"123ab456" #=>3
p $& #=>"ab"
p $` #=>"123"
p $' #=>"456"
取出MatchData,用$~
/(a)b/=~"123ab" #=>3
p $` #=>"123"
p $' #=>""
p $& #=>"ab"
p $~ #=><MatchData "ab" 1:"a">
用形如"\num"来匹配群组1,群组2,群组3……群组num的字符
/a(b)\1/=~"abc" #=>nil
/a(b)\1/=~"abb" #=>0
/(a)(b)\1\2/=~"abaa" #=>nil
/(a)(b)\1\2/.match("123abab") #=><MatchData "abab" 1:"a" 2:"b">
/(a)(b)\2/=~"abb" #=>0
/((a)(b))\1/.match("123abab") #=><MatchData "abab" 1:"ab" 2:"a" 3:"b">
/(a|b)\1/=~"ab" #=>nil
/(a|b)\1/=~"ba" #=>nil
/(a|b)\1/=~"aa" #=>0
/(a|b)\1/=~"bb" #=>0
若要在\num后面添加数字,则必须得给\num添加括号
/a(b)(\1)2/=~"ab12" #=>nil
/a(b)(\1)2/=~"abb2" #=>0
使用索引
mat1=/.a/.match("123a") #=><MatchData "3a">
p mat1[0] #=>”3a”
p mat1[1] #nil
mat2=/(.)a/.match(“123a”) #=><MatchData “3a” 1:”3″>
p mat2[0] #=>”3a”
p mat2[1] #=>”3″
p mat2[2] #=>nil
若只想有群组的功能,而没有回溯参照的功能,则可以使用(?:)
/(a)(?:b)(c)/.match(“123abcd”) #=><MatchData “abc” 1:”a” 2:”c”>
12.(?!exp)和(?=exp)
(?!exp) 匹配后缀不是exp
/ab(?!c)/=~"abc" #=>nil
/ab(?!c)/=~"abe" #=>0
(?=exp) 匹配后缀为exp
/ab(?=c)/=~"abc" #=>0
/ab(?=c)/=~"abe" #=>nil
13.sub方法和gsub方法
sub方法和gsub方法都是用来取代字符串中字符的方法,
第一个参数指定匹配样式,第二个参数指定想要代入的字符串。
sub方法只会取代第一个匹配成功的字符串,
而gsub方法会取代所有匹配成功的字符串
sub方法,sub!方法
str="abc\n123\456"
str.sub(/\n/,'d') #=>"abcd123\n456"
gsub方法,gsub!方法
str="abc\n123\n456"
str.gsub(/\n/,'d') #=>"abcd123d456"
sub方法和gsub方法也可以传入区块
str="ab12ac34ad"
str.gsub(/a./){|mat|
print "string ",mat,"\n"
}
#=>
string ab
string ac
string ad
14.scan方法
scan方法会查找字符串中所有匹配的字符,并以数组返回
"12ab34ac56ad".scan(/a./) #=>["ab","ac","ad"]
scan方法也可以传入区块
"12ab34ac56ad".scan(/a./){|mat|
print "string ",mat,"\n"
}
#=>
string ab
string ac
string ad
当正则表达式中含有(),则匹配成功的部分会以数组的形式传入区块
"12ab34ac56ad".scan(/(a)(.)/){|mat|
print mat
}
#=>
["a","b"]
["a","c"]
["a","d"]
若区块中的变量和正则表达式中的()一样多式,则不会传入数组
"12ab34ac56ad".scan(/(a)(.)/){|m,n|
print n," after ",m,"\n"
}
#=>
b after a
c after a
d after a
15.正则表达式的条件判断
if /reg/ =~ "string"
匹配成功时的动作
else
匹配失败时的动作
end
16.# Regexp .match(text)
md = /(\d\d):(\d\d)(..)/.match("12:50am")
puts "Hour is #$1, minute #$2"
puts "Hour is #{md[1]}, minute #{md[2]}"
# Regexp .quote(text) | .escape(text)
# String .index(Regexp) | =~
17.# String .scan(Regexp)
"abcabcabz".scan(%r{abc}).each {|item| puts item} # 输出2行abc
puts "2010-11-22 2022-08-25".scan(/\d{4}-\d{2}-\d{2}/)
puts "2010-11-22 2022-08-25".scan(/(\d{4})-(\d{2})-(\d{2})/)
18.#String .slice(Regexp)
string = "Date: 2012-12-23"
regex = /\d{4}-\d{2}-\d{2}/
p string.slice(regex) # 2012-12-23
19. #String.split(Regexp)
p "2012-12-23".split(/-/)
20.# String.sub | .gsub(Regexp,String)
str = "ABDADA"
p str.sub(/A/, "*") #返回"*BDADA"
p str.gsub(/A/, "*") #返回"*BD*D*"
相关推荐
接下来,我们将深入探讨Ruby正则表达式的主要知识点。 ### 一、字符规则 1. **基础字符匹配**:`/a/`会匹配字符`a`。 2. **字符集**:`/[\d]/`匹配任意数字;`/[\w]/`匹配任何字母、数字或下划线;`/[\s]/`匹配...
### 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**:讲解了如何在...