Ruby 札记 - 常谈正则表达式

前言

Ruby 对正则表达式支持比较好,简单整理一下。开门推荐三链接。 Rubular:在线 Ruby 正则表达式精品编辑器,支持多版本 Ruby Ruby Doc Ruby (英文)文档 30 分钟入门正则表达式: 还不错的正则整理文档

CheatSheet

语法

Ruby 中正则组成比较简单,模式如下,表达式返回 RegExp 对象。

/pattern/optional_modifier
复制代码

万物皆对象,可以验证下

?> puts /GracKanil/.class
Regexp
=> nil
复制代码

既然是对象,可以创建 RegExp 对象,用于正则匹配

?> r = Regexp.new 'Grac'
=> /Grac/
>> p "Grac Kanil".match r
#<MatchData "Grac">
=> #<MatchData "Grac">
复制代码

一般规则

  • 匹配字符
/G/
复制代码
  • 匹配特殊符号,包括 ^, $, ?, ., /, \, [, ], {, }, (, ), +, *
/\?/
复制代码
  • .匹配任意字符
/.G/ # 匹配 KG, kG ...
复制代码
  • 匹配范围
/[ab]c/ # 匹配 ac 或者 bc
/[a-z]/
/[a-z0-9A-Z]/
复制代码
  • 匹配不在该范围的字符串
/[^a-z]/ # 不含小写字母的字符串
复制代码
  • 任意数字,字母,空白符
/[\d]/ # 任意数字
/[\w]/ # 任意字母
/[\s]/ # 任意空字符,空格、TAB、换行

/[\D]/,/[\W]/,/[\S]/ 均为上述相反情况
复制代码

高级规则

  • 重复
? 重复零次或一次
* 重复零次或更多次
+ 重复一次或更多次
{n} 重复n次 # /d{3}/ 匹配 3 个数字
{n,} 重复n次或更多次 # /d{3,}/ 匹配 3 个数字以上
{n,m} 重复n到m次 # /d{1,10}/ 匹配 1-10 个数字
复制代码

匹配操作符

检查字符串中是否包含可以匹配的正则表达式,如果有,返回第一个匹配的字符的索引位置,如果没有,返回 `nil`。
>> "Grac Kanil" =~ /an/
=> 6
>> "Grac Kanil" =~ /at/
=> nil
>> "Grac Kanil" =~ /an/ ? "yes" : "no"
=> "yes"

大小写字母和数字范围模式匹配
?> "Grac Kanil" =~ /[aeiou]/ ? "yes" : "no"
=> "yes"
>> "Grac Kanil" =~ /[mpt]/ ? "yes" : "no"
=> "no"

`[]`表示同时搜索的单个字符列表
?> "Grac Kanil" =~ /[a-z]/ ? "yes" : "no"
=> "yes"
>> "Grac Kanil" =~ /[0-9]/ ? "yes" : "no"
=> "no"
>> "Grac Kanil" =~ /[A-Z]/ ? "yes" : "no"
=> "yes"
复制代码

regexp#match(str) 匹配

返回 MatchData ,一个数组,从 0 开始,还有 match.pre_match 返回匹配前内容,match.post_match 返回匹配后内容

?> c = /cat/.match("bigcatcomes") # 等价于 c = /cat/.match %r{bigcatcomes}
=> #<MatchData "cat">
>> c.pre_match
=> "big"
>> c.post_match
=> "comes"
>> c[0]
=> "cat"
复制代码

与此同时,可以使用 str.match regex

>> "Grac Kanil".match /.rac/
=> #<MatchData "Grac">
复制代码

匹配所有

regexp#match() 只能匹配一次,如果想匹配所有要用 regexp#scan()

?> "abcabcabz".scan(%r{abc}).each {|item| puts item}
abc
abc
=> ["abc", "abc"]
复制代码

分组匹配

Ruby 分组匹配和其他语言分组匹配相似,需要分组的部分加上括号

特殊变量

` , & ,$' 这三个变量分别表示【上次匹配之前的字符串 等同于 pre_match】、【匹配的字符串】、【上次匹配结果之后的字符串 等同于 post_match】

>> puts "Grac Kanil is a name." =~ /Kanil/
5
=> nil
>> p $`
"Grac "
=> "Grac "
>> p $&
"Kanil"
=> "Kanil"
>> p $'
" is a name."
=> " is a name."
复制代码

替换

很多时候需要替换字符串中所有的子串,Ruby 使用 sub()gsub() 可以简单实现。

  • sub 只替换第一次匹配
  • gsub(g:global) 会替换所有的匹配,
  • 没有匹配到返回原字符串的 copy 字符串
str = "ABDADA"
new_str = str.sub(/A/, "*") 	#返回"*BDADA"
new_str2 = str.gsub(/A/, "*")	#返回"*BD*D*"
复制代码

修饰语

也正是 /pattern/optional_modifier 中的 optional_modifier

  • i 忽略大小写,/abc/i 可以匹配 ABC,abc,Abc 等。
  • m 使得正则表达式可以和任何字符匹配,包括换行符,通常情况下圆点通配符不匹配换行符。
  • x 忽略空格,允许在整个表达式中放入空白符和注释。 ...

  • ^ 字符匹配了字符串或行的开头
/^me/  # 匹配以 me 开头的字符串
复制代码
  • $ 字符匹配了字符串或行的结尾
/me$/  # 匹配以 me 结尾的字符串
复制代码
  • \A字符匹配了字符串的开头
/\ARuby/ # 匹配以 "Ruby" 开头的字符串
复制代码
  • \Z字符匹配了字符串的结尾
/Ruby\Z/ # 匹配以 "Ruby" 结尾的字符串
复制代码
  • \b 字符匹配词的边界
/\bRuby\b/ # 匹配单词边界的 "Ruby"
复制代码
  • \B 字符匹配非词的边界
/\brub\B/ # 匹配 "rube" 和 "ruby" 中的 "rub",但不匹配单独的 "rub"

复制代码

贪婪匹配和不贪婪匹配

/<.*>/  # 贪婪重复:匹配 "<ruby>perl>"
/<.*?>/ # 非贪婪重复:匹配 "<ruby>perl>" 中的 "<ruby>"
复制代码

可能帮到您的链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值