正则表达式——字符类、分支条件、分组

思路来源:http://deerchao.net/tutorials/regex/regex.htm#alternative

感谢deerchao,写的比菜鸟教程好太多了。现在感觉菜鸟教程可能就是翻译了一些doc,而且是思路结构不太清晰的doc……

进入正题,主要还是看了教程后自己的理解。

字符类

字符类,即为如 [aeiou]、[1-9]、[19]、[.?!] 等用英文中括号括起字符的字符集合。

解释与辨析:

[aeiou]:匹配a 或 e 或 i 或 o 或 u 。

[0-9]:匹配 0 或 1 或 2 或 3……0-9 中的一个数字。(含义与 \d 完全一致:一位数字)

[09]:匹配 0 或者是 9 。

[.?!]:匹配 . 或 ?或是 !

同理[a-z0-9A-Z_]也基本等同于 \w(匹配非特殊字符,即a-z、A-Z、0-9、下划线、汉字)。

#补充 \W 的意思:匹配特殊字符,即非字母、非数字、非下划线、非汉字。

所以中括号[]就像是划定了一个字符范围一样。接下来是一个复杂的表达式: \(?0\d{2}[) -]?\d{8}。

这个表达式可以匹配几种格式的电话号码,像(010)88886666,或022-22334455,或是02912345678等等。

对它进行分析:首先是\(对左括号的转义,同时加?代表可1可无;然后是一个数字0和\d{2},代表0和两个数字;往后就是一个字符类范围[) -]?,左括号、空格、hyphen三选一可1可无;最后是\d{8}八个数字。

不幸的是这样的表达式也会匹配到一些错误的电话号码格式,如010)12345678、(022-87654321。

所以引入下一个知识点:分支条件。

分支条件

正则表达式中的分支条件指:我现在有这几种匹配规则,如果对象满足其中任意一种匹配规则就成功。具体方法是用 | 把不同的匹配规则分开。

0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种带有hyphen连接的匹配规则:一种是三位区号,8位本地号(如010-12345678);一种是4位区号,7位本地号(0376-2233445)。

\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用(两种匹配规则),区号与本地号间可以用hyphen或空格间隔,也可以都不用,但不能都用。我觉得[ -]?可以这样理解:先[ -]二选一,再?对二选一出来的东西其判断0或1。

\d{5}-\d{4}|\d{5}这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字,或是用hyphen间隔的9位数字。这个例子能说明一个注意点:使用分支条件时,要注意不同条件之间的顺序

如果你把上面的表达式改成\d{5}|\d{5}-\d{4}(两规则前后调换)的话,那就只会匹配5位的邮编(以及9位邮编的前5位)。原因是当系统在匹配分支条件中的不同规则时,将会从左到右地测试每个规则。当满足了第一个分支规则的话,就不会再去测试第二个分支规则了。如下图↓所诠释的:

分组

我们已经知道如何重复单个字符(在字符后添加限定符+*?即可)。但如果我们需要重复多个字符该怎么办?故引入概念:分组。

分组就是在多个字符(子表达式)的左右添加小括号,然后加{n}。就指定了这个子表达式的重复次数n了。

(\d{1,3}\.){3}\d{1,3} 是一个简单的IP地址匹配表达式。

分析这个表达式:(){3}代表它是一个重复三次的分组,括号内\d{1,3}\.指一到三位数字加一个point点,合在一起 (\d{1,3}\.){3} 就是匹配三位数字加上一个point点(这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。

  • 如果不在point点前放置转义符号,原point点指 匹配除了换行符(\n)之外的任意一个字符。
  • {m,n}指表达式至少重复m次,最多重复n次,比如:"ba{1,3}"可以匹配"ba"或"baa"或"baaa"。

不幸的是,它也将匹配256.300.888.999这种不可能存在的IP地址。如果能使用算术比较的话,或许能简单地解决这个问题,但是正则表达式中并不提供关于数学的任何功能,所以只能使用冗长的分组选择。

  • IP地址中每个数字都不能大于255。同时, 01.02.03.04 这种数字前面带有0的地址,也是正确的IP地址。IP 地址里的数字可以包含“前导 0 (leading zeroes)“。

这个表达式描述了一个正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。

理解这个表达式的关键是理解2[0-4]\d|25[0-5]|[01]?\d\d?。分析它!

整体结构为带有两个 | 的三分组结构。

首先是 2[0-4]\d:数字2 + 0-4中的一个数字 + 0-9中的一个数字;                     200-249

中间是 25[0-5]:数字2 + 数字5 + 0-5中的一个数字;                                        250-255

最后是[01]?\d\d?:0或1(可1可无) + 一个数字 + 一个数字(可1可无)        0-199

原文地址:https://www.cnblogs.com/hsh17/p/10891910.html

时间: 2024-08-29 10:16:24

正则表达式——字符类、分支条件、分组的相关文章

JavaScript正则表达式-字符类

JavaScript正则表达式字符类包括六种: 1.字符列表. 2.反向列表. 3.字符范围. 4.反向范围. 5.组合类. 6.预定义类. 字符列表 在方括号内指定一个或者多个字符组成的字符列表,与字符列表中任意字符匹配,都被认为是匹配的.每次匹配只能匹配列表中的一个字符. str = "bird,head,fed,meadow,3d"; reg_pattern = /[rea3s]d/g; arr_m = str.match(reg_pattern);//arr_m = [&quo

正则表达式-字符类

字符类是对通配符概念的改进.我们可以列出要匹配的字符,而不是匹配特殊位置的任意字符.使用方括号元字符( [] )将字符列表括起来,其中每个字符占据一个位置. 字符类在处理大写和小写字母时非常有用.例如,如果"what" 可能以首字母大写或小写的形式出现,则可以指定: [Ww]hat 这个正则表达式可以匹配"what" 或"What" .它匹配包含这4个字符的字符串的任意行,第一个字符是"W" 或"w" .因

正则表达式-字符类减法

字符类减法: [base_group - [excluded_group]] 一个字符类定义一组字符. 字符类减法将产生一组字符,该组字符是从一个字符类中排除另一个字符类中的字符的结果. 字符类减法表达式具有以下形式: [ base_group -[ excluded_group ]] 方括号 ([]) 和连字符 (-) 是强制的. base_group 是正字符组或负字符组. excluded_group 部分是另一个正字符组或负字符组,或者是另一个字符类减法表达式(即,可以嵌套字符类减法表达

Linux正则表达式-排除字符类

通常,字符类包括在哪个位置想要匹配的所有的字符.在类中作为第一个字符的脱字符(^)将类中的所有字符排除在被匹配之外.相反,除换行符以外的没有列在方括号中的任意字符都将匹配.下面的模式将匹配任意非数字字符: [^0-9] 它匹配字母表中所有的大写和小写字母以及所有特殊字符,例如标点符号.排除特殊字符有时比显示地列出想要匹配的所有字符更方便.例如,如果想要匹配任意辅音,可以简单地排除元音: [^aeiou] 该表达式匹配任意辅音,大写的任意元音,任意标点符合或特殊的字符. 请看下面的正则表达式: \

JS正则表达式从入门到入土(2)—— 元字符和字符类

元字符和字符类 元字符 正则表达式由两种基本字符类型组成: 1.原义(正常)文本字符:代表本身含义的字符,如:a.b.c.1.2.3等. 2.元字符:元字符是在正则表达式中有特殊含义的非字母字符,如\b代表单词边界,可以是单词的开头或结尾. 常见的符号元字符: *+?$^.|\(){}[] 字符类 一般情况下,正则表达式一个字符对应字符串一个字符.比如,表达式ab\t的含义就是ab加上一个\t(水平制表符). 但是,很多时候,我们不想匹配某个字符,而想匹配某类字符.此时,我们可以使用元字符[]来

正则表达式中的字符类

字符类引用 [[:alnum:]] 字母和数字 [[:alpha:]] 字母[[:blank:]] 仅表示空格和制表符[[:cntrl:]] 控制字符[[:digit:]] 十进制数[[:graph:]] 打印字符,不包含空格[[:lower:]] 小写字母[[:upper:]] 大写字母[[:print:]] 打印字符,包含空格[[:punct:]] 打印字符,不包含字母和数字[[:space:]] 空格[[:xdigit:]] 十六进制数

java正则表达式中的POSIX 字符类和Unicode 块和类别的类介绍

假如现在有一个需求,要你用Java语言来匹配出一个文本里面的所有(英文半角)标点符号,你会怎么写呢?我想大多数人应该是把这些符号都罗列出来, 如: !"#$%&'()*+,-./:;<=>[email protected][\]^_`{|}~ 但[!"#$%&'()*+,-./:;<=>[email protected][\]^_`{|}~]这样写需要转义一下, 结果为: [-!"\#\$%&'()*+,./:;<=>

常用正则表达式字符说明

元字符 . . 除换行符的任意字符 DOTALL\ 转义字符[…] 字符集合\d 数字:[0-9]\D 非数字[^0-9]\s 空白字符[<空格>\t\r\n\f\n]\S 非空白字符[^\s]\w 单词字符[A-Za-z0-9_]\W 非单词字符[^\w] 数量词 * 匹配前一个字符0或者多次+ 匹配前一个字符1次或者多次? 匹配前一个字符0次或者1次{m} 匹配前一个字符m次{m,n} 匹配前一个字符m至n次数量词? 变成非贪婪模式 边界 ^ 匹配字符串开头,多行匹配每一行开头$ 匹配字符

正则表达式-字符的范围

连字符(-)用于指定一个字符范围.例如,所有大写英文字符的范围可以指定为: [A-Z] 一个数字的范围可以指定为: [0-9] 该字符类有助于解决匹配文章引用的问题.请看下面的正则表达式: [cC]hapter [1-9] 它匹配字符串"chapter" 或"Chapter" 且其后面跟有空格,然后是从1到9的任意单个数字,下面的每一行都匹配这种模式: you will find the information in chapter 9 and chapter 12