“[”和"]"
例如,[abc] 将匹配"a", "b", 或 "c"中的任意一个字符;也可以用区间[a-c]来表示同一字符集,和前者效果一致。如果你只想匹配小写字母,那么 RE 应写成 [a-z].
[^5]将匹配除 "5" 之外的任意字符。
一些元字符
写道
^ 匹配要查找的字符串的开头
& 匹配要查找的字符串的结尾
. 匹配除了换行符之外的任意字符串
\b 单词的开头或结尾,也就是单词的分界处
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ \t\n\r\f\v]。
\S 匹配任何非空白字符;它相当于类 [^ \t\n\r\f\v]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。
元字符^和$都匹配一个位置,这和\b有点类似。^匹配你要用来查找的字符串的开头,$匹配结尾。这两个代码在验证输入的内容时非常有用,比如一个网站如果要求你填写的QQ号必须为5位到12位数字时,可以使用:^\d{5,12}$。
重复
我们讨论的第一个重复功能的元字符是 *。* 并不匹配字母字符 "*";相反,它指定前一个字符可以被匹配零次或更多次,而不是只有一次。
举个例子,ca*t 将匹配 "ct" (0 个 "a" 字符), "cat" (1 个 "a"), "caaat" (3 个 "a"
字符)等等。RE 引擎有各种来自 C 的整数类型大小的内部限制,以防止它匹配超过2亿个 "a"
字符;你也许没有足够的内存去建造那么大的字符串,所以将不会累计到那个限制。
象 * 这样地重复是“贪婪的”;当重复一个 RE 时,匹配引擎会试着重复尽可能多的次数。如果模式的后面部分没有被匹配,匹配引擎将退回并再次尝试更小的重复。
一步步的示例可以使它更加清晰。让我们考虑表达式 a[bcd]*b。它匹配字母 "a",零个或更多个来自类 [bcd]中的字母,最后以 "b" 结尾。现在想一想该 RE 对字符串 "abcbd" 的匹配。
Step |
Matched |
Explanation
|
1 |
a |
a 匹配模式
|
2 |
abcbd |
引擎匹配 [bcd]*,并尽其所能匹配到字符串的结尾
|
3 |
Failure |
引擎尝试匹配 b,但当前位置已经是字符的最后了,所以失败
|
4 |
abcb |
退回,[bcd]*尝试少匹配一个字符。
|
5 |
Failure |
再次尝次b,但在当前最后一位字符是"d"。
|
6 |
abc |
再次退回,[bcd]*只匹配 "bc"。
|
7 |
abcb |
再次尝试 b ,这次当前位上的字符正好是 "b"
|
另一个重复元字符是 +,表示匹配一或更多次。请注意 * 和 + 之间的不同;* 匹配零或更多次,所以根本就可以不出现,而 +
则要求至少出现一次。用同一个例子,ca+t 就可以匹配 "cat" (1 个 "a"), "caaat" (3 个 "a"), 但不能匹配
"ct"。
还有更多的限定符。问号 ? 匹配一次或零次;你可以认为它用于标识某事物是可选的。例如:home-?brew 匹配 "homebrew" 或 "home-brew"。
最复杂的重复限定符是 {m,n},其中 m 和 n 是十进制整数。该限定符的意思是至少有 m 个重复,至多到 n
个重复。举个例子,a/{1,3}b 将匹配 "a/b","a//b" 和 "a///b"。它不能匹配 "ab" 因为没有斜杠,也不能匹配
"a////b" ,因为有四个。
你可以忽略 m 或 n;因为会为缺失的值假设一个合理的值。忽略 m 会认为下边界是 0,而忽略 n 的结果将是上边界为无穷大 -- 实际上是先前我们提到的 2 兆,但这也许同无穷大一样。
细心的读者也许注意到其他三个限定符都可以用这样方式来表示。 {0,} 等同于 *,{1,} 等同于 +,而{0,1}则与 ? 相同。如果可以的话,最好使用 *,+,或?。很简单因为它们更短也再容易懂。
贪婪匹配的问题
贪婪当然不是好事情。当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多
的字符。以这个表达式为例:a.*b
,它将会匹配最长的以a开始,以b结束的字符串
。如果用它来搜索aabab
的话,它会匹配整个字符串aabab
。这被称为贪婪
匹配。
有时,我们更需要懒惰
匹配,也就是匹配尽可能少
的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?
。这样.*?
就意味着匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复
。现在看看懒惰版的例子吧:
a.*?b
匹配最短的,以a开始,以b结束的字符串
。如果把它应用于aabab
的话,它会匹配aab(第一到第三个字符)
和ab(第四到第五个字符)
。
分枝条件
分枝条件是指某个正则表达式有两种条件-两种条件都可以。比如某地的邮编标准:既可以是5位数字,也可以是9位数字(1123-23456)这样的表示方式。那么就要用到“|”表示了。
\d{5}-\d{4}|\d{5}
使用分枝条件时,要注意各个条件的顺序
。如果你把它改成\d{5}|\d{5}-\d{4}
的话,那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。
分享到:
相关推荐
### 常用JS正则表达式写法详解 #### 1. 手机号码验证 在进行手机号码验证时,通常需要确保输入的是中国大陆有效的手机号码格式。根据描述中的代码示例,我们可以看到几种不同的正则表达式来匹配不同类型的手机号码...
### 数字正则表达式写法参考书知识点详解 #### 一、正则表达式的概念与应用 正则表达式是一种强大的文本处理工具,能够帮助我们进行文本匹配、替换等操作。在各种编程语言和软件开发中都有广泛的应用。本文档主要...
想使用正则表达式来获取一段文本中的任意字符,写出如下匹配规则: (.*) 结果运行之后才发现,无法获得换行之后的文本。... 您可能感兴趣的文章:比较详细Python正则表达式操作指南(re使用)Python中正则表达式的详细教程
RE2 / J:Java中的线性时间正则表达式匹配 RE2是一个正则表达式引擎,其运行时间与输入大小成线性关系。 RE2 / J是RE2到纯Java的移植。 Java的标准正则表达式包java.util.regex和许多其他广泛使用的正则表达式包...
在“灵者正则调试器(RE God) v1.3”这款工具中,用户可以体验上述功能,提高正则表达式的编写效率和准确性。无论是初学者还是经验丰富的开发者,都可以从中获益。使用这样的工具,不仅可以避免因手动测试带来的低效...
d^`:这部分的 `d` 应该是一个错误,正确的写法应该是 `\d` 来匹配任何数字(包括 0)。因此,这部分应被解释为匹配一个可选的负号后面跟着至少一个数字。 - `(\.\d*)?`:与第一部分相同,表示小数点后可选的任意...
Python中的正则表达式是通过内置的`re`模块实现的,它允许程序员处理和匹配字符串,以查找、替换或提取特定模式。正则表达式并非独立的程序,而是一种模式,需要在支持它的工具或编程语言中使用。在Python中,我们...
这个模块提供了与 Perl 相似l的正则...上面的写法是不是觉得很麻烦,为了使正则表达式具有更好的可读性,Python特别设计了原始字符串(raw string),需要提醒你的是,在写文件路径的时候就不要使用raw string了,这里
在实际应用中,可以通过编程语言提供的正则表达式库(如Python中的re模块、JavaScript中的RegExp对象等),将上述正则表达式应用到文本匹配和提取中。 需要注意的是,虽然正则表达式非常强大,但当面对复杂的HTML...
在新版的Django中,path...在使用re_path时,应当注意正则表达式的写法,确保它能够正确匹配预期的URL,并为视图函数提供正确的参数。希望以上内容能够帮助大家解决在新版Django中遇到的path不能使用正则表达式的问题。
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一...
在实际应用中,正则表达式的匹配规则可以被嵌入到各种编程语言的字符串处理函数中,如JavaScript的String.prototype.match()或Python的re模块中的re.match()等。但需要注意的是,在不同的编程语言和环境中,正则...
3. **正则写法**: - 简写:`var re = /pattern/;` - 完整写法:`var re = new RegExp('pattern', 'modifiers');`,其中`modifiers`表示修饰符,如`i`用于忽略大小写。 三、正则表达式的方法 1. **test()**:测试...
在Python中,正则表达式功能是通过内置的`re`模块提供的。 1. 匹配数字: - 正则表达式中的`\d`可以匹配任意单个数字字符(0-9),而`\d+`则可以匹配连续的一串数字。 - 如果需要匹配特定格式的数字,例如电话...
文章中还提到了正则表达式写法的一些细节,比如捕获组的使用。捕获组用于从字符串中提取匹配的子字符串,可以通过括号`()`来定义。 ```javascript var re = /(\d+) (\d+)/; var str = "There are 200 apples and ...
在Python中,可以使用内置的`re`模块来实现正则表达式的相关操作。 描述中提及了关于中文正则表达式的使用方法以及字符编码的相关操作技巧。这里需要了解的几个关键点包括:中文字符在正则表达式中的表示方式、如何...
### 常用正则表达式知识点解析 #### 一、匹配中文字符的正则表达式 **表达式**: `[\u4e00-\u9fa5]` **应用场景**: - **文本处理**:在进行中文文本的搜索、过滤、替换等操作时非常有用。 - **数据验证**:例如在...
为了使用松散正则表达式,Python的`re`模块提供了一个`re.VERBOSE`参数,该参数必须明确传递给匹配函数(如`re.search`),以告知Python解析器所给的正则表达式是一个松散表达式。如果不使用`re.VERBOSE`,则Python...