正则表达式

一、正则表达式简介


1. 什么是正则表达式

正则表达式(Regluar Expressions)又称规则表达式,这个概念最初是由Unix中的工具软件(如sed 和 grep)普及开的。正则表达式在代码中常简写为REs,regexes或regexp(regex patterns)。它本质上是一个小巧的、高度专用的编程语言。 许多程序设计语言都支持通过正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。

2. 正则表达式能做什么

正则表达式的主要应用对象是文本,使用正则表达式可以指定想要匹配的字符串规则,然后通过这个规则来匹配、查找、替换或切割那些符合指定规则的文本。总体来讲,正则表达式可以对指定的文本实现以下功能:

  • 匹配验证: 判断给定的字符串是否符合正则表达式所指定的过滤规则,从而可以判断某个字符串的内容是否符合特定的规则(如email地址、手机号码等);当正则表达式用于匹配验证时,通常需要在正则表达式字符串的首部和尾部加上^和$,以匹配整个待验证的字符串。
  • 查找与替换: 判断给定字符串中是否包含满足正则表达式所指定的匹配规则的子串,如查找一段文本中的所包含的IP地址。另外,还可以对查找到的子串进行内容替换。
  • 字符串分割与子串截取: 基于子串查找功能还可以以符合正则表达式所指定的匹配规则的字符串作为分隔符对给定的字符串进行分割。

二、正则表达式中的字符


正则表达式的主要应用对象是文本,其最基础的功能是文本匹配,而文本是由一个个的字符组成,因此正则表达式实际上是对字符的匹配。正则表达式中的字符分为 普通字符元字符,而正则表达式就是这些普通字符和特殊元字符组合成的表示一个特定匹配规则的表达式。

1. 普通字符

实际上,大多数字符都将简单地匹配它们的自身值,它们被称为普通字符,如数字(0-9),字母(a-z, A-Z)等。例如,正则表达式hello123将匹配字符串'hello123',因为该这则表达式中都是普通字符,不包含特殊元字符。当然,我们可以通过指定正则表达式的匹配模式为 忽略字母大小写模式,这么正则表达式hello123将能够匹配'Hello123', 'HellO123', 'HELLO123'等字符串。

提示: 其实我们并不需要去记忆哪些字符是普通字符,我们只需要知道哪些字符是特殊元字符就可以了,除了特殊元字符之外的所有字符都是普通字符。

2. 元字符

上面提到,正则表达式除了进行字符自身之的匹配外,还可以基于指定的规则进行模糊匹配。这就意味着它需要一些特殊字符来表示这些模糊的匹配规则,因此这些特殊字符默认情况下并不能匹配到它们自身的字面值,而是表示某些特殊的功能。这些特殊元字符包括:., [, ], (, ), *, +, ?, ^, $, \, |。这些特殊字符的使用,会在下面进行详细讲解。正则表达式的重点和难点也就在于对正则表达式引擎的工作原理以及对这些特殊元字符掌握和灵活运用。

提示: 那么如果想匹配这些特殊元字符本身的字面值怎么办呢?我们可以通过其中一个特殊字符对其它特殊字符进行转义,从而达到可以匹配这些特殊字符自身字面值的目的。

三、元字符详解


现在我们来详细说明一下正则表达式中的特殊元字符到底能完成哪些复杂的匹配功能。

1.单个字符匹配

说明: 所有的特殊字符在[ ]内都将失去其原有的特殊含义:

  • 有些特殊字符在[ ]中被赋予新的特殊含义,如 '^'出现在[ ]中的开始位置表示取反,它出现在[]中的其他位置表示其本身(变成了一个普通字符);
  • 有些特殊字符则变为普通字符,如 '.', '*', '+', '?', '$'
  • 有的普通字符变为特殊字符,如 '-' 在[ ]中的位置不是第一个字符则表示一个数字或字母区间,如果在[ ]中的位置是第一个字符则表示其本身(一个普通字符)
  • 在[ ]中,如果要使用'-', '^' 或']',可在在它们前面加上反斜杠,或把'-', ']'放在第一个字符的 位置,把'^'放在非第一个字符的位置。

2. 预定义字符集

我们可以在反斜杠后面跟上一个指定的字母来表示预定义的字符集合

3. 字符次数匹配--量词

在正则表达式中,我们还可以指定匹配某个字符出现次数

说明: {m,n}中的m和n可以省略其中一个,{,n}相当于{0,n},{m,}相当于{m,整数最大值}。

我们可以得出以下结论:

  • {0,1}或{,1} 等价于 ?
  • {1,} 等价于 +
  • {0,} 等价于 *

我们优先选择使用 ?, + 和 *,因为他们书写简单,也可以使整个正则表达式变得简洁。

说明: ? 这个字符在正则表达中与 ?, +, *, {m,n}连用时还有一个额外的功能,就是将匹配模式由贪婪模式(尽可能的增加匹配次数) 变成 非贪婪模式(尽可能减少匹配次数), 这个会在下面的内容中进行详细说明。

4. 边界匹配

正则表达式中还可以对边界位置进行匹配,如一个字符串的开头或结尾,一个单词的开头或结尾。

5. 逻辑与分组

语法 | 说明 | 表达式实例 | 可匹配到的字符串实例

6. 特殊构造

说明: 上面所说的“不消耗字符串内容”是指只是进行匹配,但是不移动原始字符串的匹配位置,这样就可以完成多次匹配。下面有个匹配密码的正则表达式实例,就是用这个特性巧妙完成的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值