Ruby 正则表达式

正则表达式是使用一串字符来匹配一系列符合某个语法规则的字符串,通常被用于检索和替换符合模式的文字。本章节中我们讲学习在 Ruby 中如何使用正则表达式。

1. 创建正则表达式

在 Ruby 中,我们在两个/之间定义正则表达式,最简单的正则表达式匹配一个单词或者一个字符串。

实例:

> /a/.class
=> Regexp

我们还可以使用Regexp类将字符串实例化为正则对象。

实例:

> regexp = Regexp.new("a")
=> /a/

除了上述方法还可以使用%r[]

实例:

> regexp = %r{w+}
=> /w+/

2. 如何使用正则表达式

2.1 匹配一个字符或一组字符

我们通常使用=~来进行字符串和正则表达式的匹配,正则表达式中写出我们需要匹配的字符或字符串即可。

实例:

'Hello World' =~ /Hello/

# ---- 输出结果 ----
0

解释:之所以结果返回0,是因为在字符串0索引找到该单词Hello(返回该单词首次出现的索引)。

那如果字符串不能匹配正则呢?

那将返回nil

实例:

'Hello World' =~ /Hi/

# ---- 输出结果 ----
nil

Tips=~返回nil或者匹配的第一个索引。

检查字符串是否匹配正则的第二种方式是使用match

实例:

if "Hello World".match?(/Hello/)
  puts "Match found!"
end

# ---- 输出结果 ----
Match found!

Tips:match?是2.4之后才有的方法,返回true或false,2.4之下只有match方法,返回MatchData对象。

2.2 匹配指定几个字符或范围字符

我们使用[],来匹配几个指定字符或者范围的字符。

匹配所有带a、b、c的字符串。

实例:

def contains_abc(str)
  str =~ /[abc]/
end

contains_abc('test')
contains_abc('bell')
contains_abc('apple')

# ---- 输出结果 ----
nil
0
0

匹配a~c的所有字符(abc)。

实例:

def contains_abc(str)
  str =~ /[a-c]/
end

contains_abc('test')
contains_abc('bell')
contains_abc('apple')

# ---- 输出结果 ----
nil
0
0

解释:上述的例子表示,[a-c][abc]代表一样的内容。

Tips:同样的[1-5]也代表[12345]。

另外我们还有一个取反的操作。使用^

实例:

def contains_abc(str)
  str =~ /[^a-c]/
end

contains_abc('test')
contains_abc('bell')
contains_abc('apple')

# ---- 输出结果 ----
0
1
1

解释:test第一个字符是t,符合不是a、b、c的正则所以返回索引0,bell的第一个字符b不匹配正则,而e匹配,所以返回索引1,apple的第一个字符a不匹配正则,p匹配,所以返回1。

这些是常用匹配范围字符的正则:

方法 时机简介(调用的时机)
w 同:[0-9a-zA-Z_]
d 同:[0-9]
s 同:匹配空格、制表符、换行符。
W 同:[^0-9a-zA-Z_]
D 同:[^0-9]
S 同:不是空格、制表符、换行符。
. 可以匹配任意字符。

.可以匹配任意字符,.仅可以匹配.字符。

实例:

p "6b6" =~ /d.d/
p "6b6" =~ /d.d/
p "6.6" =~ /d.d/

# ---- 输出结果 ----
0
nil
0

2.3 一次匹配多个字符

上述正则只能让我们一次匹配一个字符,现在让我们来匹配多个字符。

需要使用的模式修饰符如下:

正则 匹配内容
+ 一个或多个
* 0个或多个
? 0个或1个
{2,4} 2~4之间

比如现在要判断一个字符串数字是否由均为数字组成。

实例:

'10000' =~ /^d+$/
'9999a' =~ /^d+$/

# ---- 输出结果 ----
0
nil

解释d+匹配一个或多个字符串,而^$分别匹配开头和结尾。

Tips:如果要严格匹配字符串的开头而不是仅在每一行(在n之后)匹配,则需要使用A和Z而不是^和$。

如果字符数量确认,比如4个字符,可以使用/dddd/或者/d{4}/

实例:

'word' =~ /wwww/
'word' =~ /w{4}/

# ---- 输出结果 ----
0
0

2.4 使用长正则

我们使用%r{}x来对长正则增加换行以及注释操作,使之阅读起来更简单。

实例:

IP_FORMAT = %r{
  ^d{1,3} # 1
  .
  d{1,3}  # 2
  .
  d{1,3}  # 3
  .
  d{1,3}$ # 4
}x

str = "192.168.1.1"
p str =~ IP_FORMAT

# ---- 输出结果 ----
0

3. 正则表达式选项

在 Ruby 中我们可以在正则中添加一些选项,改变正则的行为。

选项 时机简介(调用的时机)
i 正则表达式不区分大小写
m 点匹配换行符
x 忽略空格

要使用这些选项要在正则表达式结束后在末尾添加选项字母。

实例:

> "abc".match?(/[A-Z]/i)
=> true

4. 正则和 Ruby 的方法一起使用

正则可以和 Ruby 的许多方法一起使用,在这里举几个例子。

scan一起使用。

实例:

> "Hello World".scan(/w+/)
=> ["Hello", "World"]

解释:匹配到了字符串中所有的单词,并生成了一个数组。

gsub一起使用。

实例:

> "hello world".gsub(/w+/) {|w|w.capitalize}
=> "Hello World"

匹配邮箱格式是否正确。

实例:

> email = "test@example.com"
> !!(email=~ /A[w.+-]+@w+.w+z/)
=> true

Tips:这里!!将结果转换成了布尔值。

4. 小结

本章节中我们学会了如何去创建一个正则,使用正则来匹配一个或多个字符,了解了正则表达式的写法以及正则和Ruby方法的应用,在实际情况中大家要多多尝试使用正则,会极大提高自己的编程水平。