- A+
所属分类:未分类
Ruby正则表达式
Contents
正则表达式的写法
一般的创建正则表达式方式:
/模式/
如果正则模式中含有/时,也可以采用下面的方式创建正则表达式:
- %r(模式)
- %r<模式>
- %r|模式|
- %r!模式!
- %r{模式}
也可以使用类方法来创建正则表达式对象:
- Regexp.new("模式")
模式匹配的写法
- 正则表达式=~字符串
匹配失败时返回nil,成功匹配则返回该字符串起始字符的位置
普通字符匹配
当模式种不存在特殊意义的字符时,则进行普通字符匹配
普通字符匹配的例子
模式 | 字符串 | 匹配部分 |
---|---|---|
/test/ | "test" | "test" |
/test/ | "mytest" | "mytest" |
/test/ | "testtest" | "testtest" |
/test/ | "tes1t" | 不匹配 |
/test/ | "te" | 不匹配 |
/test/ | "TEST" | 不匹配 |
行首与行尾匹配
- ^表示匹配行首
- $表示匹配行尾
Ruby 的字符串,也就是 String 对象,所谓的“行”就是用换行符 (\n) 间隔的字符串。因此模式 /^test/ 也可以匹配字符串 "1234\ntest"。
字符串开头与末尾匹配
- \A表示匹配字符串的开头
- \z表示匹配字符串的末尾
- \Z表示匹配字符串的末尾(如果末尾是换行符则匹配换行符前一个字符)(慎用)
irb(main):009:0> p "abc\n".gsub(/\z/, "!")
"abc\n!"
=> "abc\n!"
irb(main):010:0> p "abc\n".gsub(/\Z/, "!")
"abc!\n!"
=> "abc!\n!"
[]指定字符范围匹配
指定匹配某字符集中的1个字符时,可以采用[字符集]的形式。
示例 | 说明 |
---|---|
[AB] | 匹配A或B |
[ABC] | 匹配A或B或C |
[BCA] | 同上(与[]中顺序无关) |
[A-Z] | 匹配从A到Z的全部大写英文字母 |
[a-z] | 匹配从a到z的全部小写英文字母 |
[A-Za-z] | 匹配全部英文字母 |
[-ABC] | 匹配-或A或B或C(-表示单纯的字符时,需写在模式的开头或者末尾) |
[^ABC] | 匹配A、B、C以外的字符(^需要写在[]的开头) |
[^a-z] | 匹配a到z以外的字符 |
匹配任意字符
使用*可以匹配任意一个字符。
示例 | 说明 |
---|---|
/^...$/ | 匹配字符数为3的行。 |
使用反斜杠的模式
- \s表示匹配空白符(空格(0x20)、制表符(Tab)、换行符、换页符)
- \d表示匹配0到9的数字
- \w表示匹配英文字母和数字
- \A表示匹配字符串的开头
- \A表示匹配字符串的开头
- \z表示匹配字符串的末尾
- 元字符转义(在元字符前添加\使元字符变成普通字符)
重复
- *表示重复0次以上
- +表示重复1次以上
- ?表示重复0次或1次
最短匹配
- *?表示匹配0次以上的重复中最短的部分
- +?表示匹配1次以上的重复中最短的部分
通过使用()与重复相结合,还可以重复匹配多个字符。
模式 | 字符串 | 匹配部分 |
---|---|---|
/^(ABC)*$/ | "ABC" | "ABC" |
/^(ABC)*$/ | "" | "" |
/^(ABC)*$/ | "ABCABC" | "ABCABC" |
/^(ABC)*$/ | "ABCABCAB" | 不匹配 |
选择
- |表示在几个候选模式中匹配任意一个
模式 | 字符串 | 匹配部分 |
---|---|---|
/^(ABC|DEF)$/ | "ABC" | "ABC" |
/^(AB|CD)+$/ | "ABCD" | "ABCD" |
quote方法
使用Regexp对象的quote方法,可以转义正则表达式中的所有元字符。
re1 = Regexp.new("abc*def")
re2 = Regexp.new(Regexp.quote("abc*def"))
p (re1 =~ "abc*def") #=> nil
p (re2 =~ "abc*def") #=> 0
正则表达式的选项
正则表达式选项的写法:
/模式/选项
/模式/选项1选项2选项...
- Regexp.new(模式, 选项常量)
- Regexp.new(模式, 选项常量1 | 选项常量2 | ...)
选项 | 选项常量 | 说明 |
---|---|---|
i | Regexp::IGNORECASE | 表示忽略英文字母大小写 |
x | Regexp::EXTENDED | 表示忽略正则表达式中的空白字符以及#后面的字符(指定该选项后,我们可以使用#在正则表达式中写注释) |
m | Regexp::MULTILINE | 表示允许使用.匹配换行符 |
o | 无 | 表示只使用一次内嵌表达式 |
写法示例:
/DEF.GHI/i
/DEF.GHI/im
Regexp.new("ABC", Regexp::IGNORECASE)
Regexp.new("ABC", Regexp::IGNORECASE | Regexp::MULTILINE)
捕获
所谓捕获,就是从正则表达式的匹配部分中提取其中的某部分。通过“$ 数字”这种形式的变量,就可以获取匹配了正则表达式中的用 () 括住的部分的字符串。另外,我们也可以使用(?:)过滤不需要捕获的模式。
/(.)(\d\d)+(.)/ =~ "123456"
p $1 #=> "1"
p $2 #=> "45"
p $3 #=> "6"
/(.)(?:\d\d)+(.)/ =~ "123456"
p $1 #=> "1"
p $2 #=> "6"
- $`表示获取匹配部分前的字符串
- $&表示获取匹配部分的字符串
- $'表示获取匹配部分后的字符串
/C./ =~ "ABCDEF"
p $` #=> "AB"
p $& #=> "CD"
p $' #=> "EF"
正则表达式的方法
方法名 | 方法说明 | 参数说明 |
---|---|---|
sub | 用指定字符替换字符串中首次匹配的部分 | 参数1为正则表达式的模式,参数2为用于替换的字符 |
gsub | 用指定字符替换字符串中所有匹配的部分 | 同上 |
scan | 获取匹配部分的字符,但不做置换操作 | 参数为正则表达式的模式 |
sub和gsub示例:
str = "abc def g hi"
p str.sub(/\s+/,' ') #=> "abc def g hi"
p str.gsub(/\s+/,' ') #=> "abc def g hi"
str = "abracatabra"
nstr = str.sub(/.a/) do |matched|
'<'+matched.upcase+'>'
end
p nstr #=> "ab<RA>catabra"
nstr = str.gsub(/.a/) do |matched|
'<'+matched.upcase+'>'
end
p nstr #=> "ab<RA><CA><TA>b<RA>"
sub 方法与 gsub 方法也有带 ! 的方法。sub! 方法与 gusb! 方法会直接将作为接受者的对象变换为置换后的字符串。
scan示例:
"abracatabra".scan(/.a/) do |matched|
p matched
end
#执行结果
"ra"
"ca"
"ta"
"ra"
"abracatabra".scan(/(.)(a)/) do |matched|
p matched
end
#执行结果
["r", "a"]
["c", "a"]
["t", "a"]
["r", "a"]
"abracatabra".scan(/(.)(a)/) do |a, b|
p a+"-"+b
end
#执行结果
"r-a"
"c-a"
"t-a"
"r-a"
2022年7月8日 上午1:56 沙发
寻找额外的钱? 尝试最好的金融工具。 https://Haus.seamonkey.es/gotodate/go
2022年7月16日 下午3:11 板凳
看看新的金融工具,它可以让你变得富有。 https://Haus.startupers.se/gotodate/go
2022年7月19日 下午11:04 地板
赚几千块钱。 金融机器人将帮助你做到这一点! https://Haus.elletvweb.it/gotodate/go
2022年7月21日 上午11:17 4楼
赚几千块钱。 金融机器人将帮助你做到这一点! https://Haus.elletvweb.it/gotodate/go
2022年7月27日 上午11:46 5楼
如果你使用这个机器人,你的电脑可以给你带来额外的收入. https://Haus.frostyelk.se/gotodate/go
2022年7月27日 下午9:56 6楼
没有投资的巨额收入是可用的,现在! https://Haus.frostyelk.se/gotodate/go
2022年7月28日 上午7:52 7楼
金融机器人不断给你带来的钱,而你睡觉。 https://Haus.frostyelk.se/gotodate/go
2022年7月31日 下午3:30 8楼
今天投资1美元,明天赚1000美元. https://Haus.qbe-medienhaus.de/Haus
2022年8月20日 下午3:10 9楼
在线收入是财务独立的最简单方法。 https://Haus.escueladelcambio.es/
2022年9月3日 上午2:09 10楼
还是不是百万富翁? 现在就修好它! https://riviello.es/promo
2022年9月3日 上午4:18 11楼
让你的电脑成为你赚钱的工具. https://riviello.es/promo
2022年9月4日 上午4:22 12楼
坐在家里赚点钱。 https://riviello.es/promo
2022年9月4日 上午6:31 13楼
没有钱? 在这里在线赚取它们很容易。 https://riviello.es/promo
2022年9月11日 上午5:35 14楼
自动机器人是财务独立的最佳开端。 https://www.kaleidoskop-sabine.org/newsletter/countlinks.php?uri=https%3A%2F%2Fvaratradgardsforening.se%2Fpromo&nid=40&did=
2022年9月15日 下午4:21 15楼
财务独立是每个人都需要的。 https://go.tygyguip.com/0j35
2022年9月22日 上午7:24 16楼
金融机器人不断给你带来的钱,而你睡觉。 http://go.obermatsa.com/0j35
2022年10月7日 下午8:32 17楼
没有投资的巨额收入是可用的,现在! https://go.cuxavyem.com/0j35
2022年10月9日 下午10:10 18楼
赚几千块钱。 不用付钱。 https://go.gepekaep.com/0j35
2022年10月10日 下午12:26 19楼
启动机器人,让它带给你的钱。 Telegram – @Cryptaxbot
2022年11月20日 上午9:19 20楼
使用金融机器人开始您的在线工作。 Telegram – @Cryptaxbot
2022年11月20日 下午11:46 21楼
赚钱24/7没有任何努力和技能。 Telegram – @Cryptaxbot
2023年1月15日 上午5:57 22楼
男友将阴茎插入蹲下的黑发女友的肛门。