正则表达式(四):正则表达式的与或非(转)
正则表达式(四):正则表达式的与或⾮(转)
原⽂:
我们使⽤正则表达式,熟练掌握各种功能和结构只是⼿段,解决实际的问题才是真正的⽬的。要解决真正的问题,就必须有解决问题的思
路,正则表达式的功能,说到底,可以归纳为三种逻辑,为了表述⽅便,我们分别称为与、或、⾮。
逻辑关系说明
与在某个位置,某些元素(字符、字符组或者⼦表达式)必须出现
或在某个位置,某个元素或许不出现,或许不出现,或许长度不固
定;要出现的,是某⼏个元素中的⼀个
⾮在某个位置,某些元素不能出现
⼀般来说,正则表达式千变万化,总是这三种逻辑的组合。⽐如匹配双引号字符串
"quoted string"
逻辑关系分析
与⾸尾的双引号字符必须出现
或两个双引号之间的字符个数是不确定的(如果是空字符串””,则两个
双引号之间没有字符)
⾮两个双引号之间不能出现双引号字符
再⽐如匹配html中的open-tag(⽐如
)和close-tag(⽐如
):逻辑关系分析
与⾸尾必须分别是<和>,如果是close-tag,则<之后必须出现/
或<和>之间必须出现⾄少⼀个字符(<>不是⼀个合法的tag)
⾮<之后不能是/字符,如果是open-tag,<之后不能出现/
下⾯我们来讲解三种逻辑的对策。
与
“与”是正则表达式中最普通的逻辑关系。⼀般来说,如果正则表达式中的元素没有任何量词(quantifier,⽐如*、?、+)修饰,就是“与”关
系。⽐如『<』,就表⽰“这⾥必须出现<字符”;『cat』,就表⽰“这⾥必须依次出现c、a、t,3个字符”。
不过“与”的情况并没有这么简单,有时候,“必须出现”的是若⼲个元素,或者说,⼏个元素必须同时出现,但它们之间并不相连,这是⾮常容
易犯错的时候,不过现在我们不举具体的例⼦,稍晚⼀点再说。
或
“或”是正则表达式中最灵活的逻辑关系。正则表达式能应对各种不同的⽂本,“或”功能不可或缺。
如果“或”的意思是,元素可以出现,也可以不出现,或者出现的次数不确定,可以⽤量词来表⽰“或”关系。⽐如表达式『a?』,表⽰在此
处,字符a可以出现,也可以不出现;表达式『(ab)+』,表⽰在此处,字符串ab必然要出现1次,也可以出现⽆限多次。
如果“或”的意思是,可以出现的是某⼏个元素中的⼀个,则应该使⽤字符组或者多选结构。当元素都是单个字符时,就应该使⽤字符组
『[…]』:⽐如匹配单词cat或者cut,除去开头的a、结尾的t是固定的,之中“或许出现a,或许出现u”,所以应当使⽤字符组『[au]』,整个
正则表达式就是『c[au]t』。当元素不只单个字符(只要有⼀个元素不只单个字符)时,就应该使⽤多选结构『(…|…)』:⽐如不但要匹配单
词cat或者cut,还要匹配单词chart、conduct和court,出去开头的a、结尾的t是固定的,之中“或许出现a,或许出现u,或许出现har,或许出
现onduc,或许出现our”,这时候就应该使⽤多选结构『(a|u|har|onduc|our)』,整个正则表达式就是『c(a|u|har|onduc|our)t』。
当然,多选分⽀也可以表⽰字符组,⽐如『[au]』就可以表⽰为『(a|u)』,两者的功能是完全等价的,但是字符组的效率更⾼,也更直观
(毕竟,⼤家都习惯了简单的『[au]』,⽽看到『(a|u)』则多半要想⼀想。
在实践中,“与”和“或”经常同时出现,⽽且关系不那么简单,下⾯举⼀个例⼦说明:为了隐藏真实的结构,我们需要⽤URL进⾏伪装,⽐如
这个URL pattern:/foo/bar_tmp.php。
在真正的系统⾥,foo是模块名,bar是控制器名,tmp是⽅法名。合法的URL并不要求3个名字每次都出现,可以只出现控制器名(/foo),
也可以只出现控制器名和模块名(/foo/bar.php),也可以3者都出现(/foo/bar_tmp.php)。
这⾥的模块名、控制器名、⽅法名,都可以⽤『[a-z]+』匹配,这⾥为说明⽅便,我们暂且⽤foo、bar、tmp代替对应的表达式。初看起来,
这个表达式只包含“与”和“或”两种关系:
逻辑关系分析
与/foo必须出现与/foo必须出现或/bar、_tmp、.php都是可选出现的
所以,正则表达式是『/foo(/bar)?(_tmp)?(\.php)?』。
这个表达式确实可以匹配/foo、/foo/bar.php和/foo/bar_tmp.php,但是,它也可以匹配/foo_tmp、/foo/bar_tmp等形式,虽然这些形式并不是
合法的。
仔细研究之后,我们发现,“与”和“或”的关系并没有那么简单,⽽应该是这样的:
逻辑关系分析
与/foo必须出现
或/bar和.php是可选出现的,但必须同时出现,或同时不出现
(与)
在/bar和.php都出现的前提下,_tmp才可以出现(或)
/foo必须出现,这很好表⽰,暂且不去管它;/bar和.php如果出现,必须同时出现,所以它们应该作为⼀个元素,写作『(/bar.php)』;整个
元素可选出现,所以给它添加量词,得到『(/bar.php)?』;最后,在/bar和.php都出现的前提下,_tmp才可以出现,所以将『(_tmp)?』填充
到『(/bar.php)?』,得到『(/bar(_tmp)?.php)?』,最后加上开头的/foo,整个表达式就是『(/bar(_tmp)?.php)?』。到此,整个关系终于完整
表达出来,表达式也不会发⽣错误匹配。
⾮
“⾮”是正则表达式中最难处理的逻辑关系。因为没有直接对应的结构,“⾮”的处理⽐较吃⼒。
最简单的“⾮”,意思是此处不能出现某个字符,这⼀点通常很直观,似乎⽤排除型字符组『[^…]』就可以解决。⽐如双引号字符串的匹配,
⾸尾两个双引号很容易匹配,其中的内容肯定不是双引号(暂时不考虑转义的情况),所以可以⽤『[^"]』表⽰即可,其长度不确定,所以
⽤*来限定,所以整个表达式就是『"[^"]*"』,⾮常简单。
但是,事情果真都如此简单吗?我们仍然举cat和cut的例⼦,如果仍然希望匹配c开头、t结尾的单词,但不希望匹配cut,可以写成
『c[^u]t』,是否就可以了?
这个表达式的意思是:最开头的字母是c,之后是⼀个不为u的字符,之后是t。没错,它确实不会匹配cut,也可以匹配cat。但是,chart、conduct、court等等,它也没法匹配,因为[^u]的意思是:匹配⼀个不是u的字符。
那么,把『[^u]』改成『[^u]+』好了,这样应该就可以解决问题了。但是真的如此吗?『[^u]+』的意思是,⼀个或若⼲(最多到⽆穷)个字
符,但每⼀个字符都不能是u。所以,尽管『c[^u]+t』能匹配cat和chart,却不能匹配conduct和court。
看来,“⾮”真是⽐较难对付,让⼈⾮常纠结。好在,也不是没有办法解决它。回复到与-或-⾮的观点,分析要实现的功能:
逻辑关系分析
与以c开头,以t结尾
或c和t之间可以出现的字母必须多于⼀个,没有上限
⾮c和t之间不能只有⼀个字符u
如果只考虑“与”和“或”两个逻辑,表达式很好写,是『c[a-z]+t』,再把剩下的条件附加上去,就可以解决问题了。我们仔细看“⾮”的条件:c
和t之间不能只有⼀个字符u。既然『[^u]+』表达的并不是这个意思,我们不妨换⼀种表述法:在c之间的位置向后看,不能出现cut。这⼀
点,正好对应否定顺序环视(positive look-ahead)功能,『(?!cut)』就是⽤来进⾏这种判断的,它判断之后的字符串能不能由cut匹配,但
并不真正真正进⾏匹配,也不会移动“当前位置”。所以我们将它放在表达式的最开头,得到『(?!cut)c[a-z]+t』。这个表达式的逻辑是:只有
在当前位置右侧字符串不能由cut匹配的情况下,才从这⾥开始,向右尝试⽤c[a-z]+t。
如果我们更进⼀步,需要排除掉cat和cut,可以把否定顺序环视改为『(?!c[au]t)』。这样就能保证,匹配到的肯定不是cat或者cut。
更复杂⼀点,如果我们要验证这样⼀个字符串:它全部由⼩写字母构成,长度不超过12位,其中不能包含unfavored或者unwanted。也可以
照章处理,先匹配“长度不超过12位”的⼩写字母『[a-z]{,12}』,然后写出匹配“不需要匹配内容”的正则表达式,『(unfavored|unwanted)』,
再⽤否定顺序环视将它“排除”即可,只是这次要注意,不能直接写『(?!(unfavored|unwanted))』,因为它只能排除
『(unfavored|unwanted)』出现在字符串开头的情况,为了排除它出现在字符串中的情况,我们要把否定顺序环视改为『(?![a-z]*(unfavored|unwanted))』,这样就确保完整的“排除”,整个表达式就是『(?![a-z]*(unfavored|unwanted))[a-z]{,12}』。
总结⼀下,正则表达式中的“⾮”,除去能⽤排除型字符组直接表⽰的,复杂⼀点的“⾮”逻辑都是按照这样的思路进⾏的:先⽤⼀个正则表达式
准确匹配需要“排除”的字符串,再⽤环视功能排除掉它——“⾮”确实是正则表达式中,最难处理的逻辑关系,好在它并不复杂,⽽且,除去⼀
些⽐较古⽼的⼯具(⽐如Apache 1.3),现在各种⼯具和语⾔,基本都⽀持这种功能。
中文符号正则表达式
中文符号正则表达式
一、校验数字的表达式
数字:^[0-9]*$
n位的数字:^\d{n}$
至少n位的数字:^\d{n,}$
m-n位的数字:^\d{m,n}$
零和非零开头的数字:^(0|[1-9][0-9]*)$
非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或
^\+?[1-9][0-9]*$
非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
非负整数:^\d+$ 或 ^[1-9]\d*|0$
非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$ 非负浮点数:^\d+(\.\d+)?$ 或
^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或
^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或
^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或
^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$
正则表达式的基本用法
正则表达式的基本⽤法
Perl 有很多其它语⾔所没有的特性,这其中对正则表达式(regular expression)的强⼤⽀持是它最为突出的⼀个亮点。正则表达式使得 perl 在处理⽂本时具有⾮常强⼤的优势:快速,灵活⽽且很可靠,甚⾄可以说,强⼤⽂本处理能⼒,是 perl 在众多语⾔中最为闪耀的⼀个特点。 因此学习 perl 的过程,必然也是学习正则表达式的过程,这或许多少给 perl 的学习增加了些少的负担,但好在正则表达式并不是 perl 所独有的, 它是⼀门使⽤⾮常⼴泛的语⾔,在很多⼯具及其它编程语⾔中都有⼴泛的⽀持,⽐如:grep,awk,sed,vi 等。 它是如此的常见,以致于编程⼈员在很多场合都⽆可避免的要与之打交道,因此掌握好正则表达的好处是⾮常明显的,好在它的语法也很简单,学习起来也不算太难。
在 Perl 或其它⼀些语⾔及⼯具中,正则表达式通常也会叫为“模式"(pattern),正则表达式本质上来说是⼀个字符串模板,⽤来确认某个字符串是否符合这个模板的格式,任何⼀个字符串,要么符合这个模板,要么不符合这个模板。具体到在Perl中,正则表达式是⽤"/"围起来的,⽐如:($string =~ /pattern/)。在这⾥我们暂且称 string 为匹配串,只有当 string 匹配了 ”pattern" 这个串时,这个表达式才是true,反之为false。如: "abc ef ffff" =~ /ef/ 为 true,"abc" =~ /ee/ 为 false。
当然上⾯的例⼦只是最简单的情形,如果正则表达式只能做这样单纯的纯字符匹配,那它就不可能这么强⼤。正则表达式通过⼀类特殊的字符,我们称为元字符或通配符(meta character)来进⾏字符的模糊表⽰,它们在匹配的过程中代表特殊的含义。下⾯我们就进⾏简单的介绍。(1) 点号(.),它⽤来匹配任意⼀个单字符(\n 排除在外,后⾯我默认不再提这个例外)。
正则表达式实用语法大全
正则表达式基本符号:
^ 表示匹配字符串的开始位置 (例外 用在中括号中[ ] 时,可以理解为取反,表示不匹配括号中字符串)
$ 表示匹配字符串的结束位置
* 表示匹配 零次到多次
+ 表示匹配 一次到多次 (至少有一次)
表示匹配零次或一次
. 表示匹配单个字符
| 表示为或者,两项中取一项
( ) 小括号表示匹配括号中全部字符
[ ] 中括号表示匹配括号中一个字符 范围描述 如[0-9 a-z A-Z]
{ } 大括号用于限定匹配次数 如 {n}表示匹配n个字符 {n,}表示至少匹配n个字符
{n,m}表示至少n,最多m
\ 转义字符 如上基本符号匹配都需要转义字符 如 \* 表示匹配*号
\w 表示英文字母和数字 \W 非字母和数字
\d 表示数字 \D 非数字
常用的正则表达式
匹配中文字符的正则表达式: [\u4e00-\u9fa5]
匹配双字节字符(包括汉字在内):[^\x00-\xff]
匹配空行的正则表达式:\n[\s| ]*\r
匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/
匹配首尾空格的正则表达式:(^\s*)|(\s*$)
匹配IP地址的正则表达式:/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //
匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
匹配网址URL的正则表达式:http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
sql语句:^(select|drop|delete|create|update|insert).*$
1、非负整数:^\d+$
2、正整数:^[0-9]*[1-9][0-9]*$
3、非正整数:^((-\d+)|(0+))$
4、负整数:^-[0-9]*[1-9][0-9]*$
5、整数:^-?\d+$
正则表达式介绍
正则表达式介绍
正则表达式是一种强大的文本处理工具,它用于匹配、查找和替换文本中的模式。它是一种特殊的语法,可以用于描述字符串的结构和内容。
在日常工作中,我们经常需要处理各种各样的文本数据,比如文本文件、数据库中的数据、网页中的内容等。而正则表达式正是将这些文本数据进行有效处理的利器。
正则表达式的语法非常丰富,包含了大量的元字符和语法规则。下面我们就来介绍一些常见的元字符和语法规则。
元字符
元字符是正则表达式中的基本单位,它用于表示某种特殊的文本字符或字符集。下面是一些常见的元字符:
1. . :用于匹配任意一个字符,除了换行符(\n)。
2. ^ :用于匹配字符串的开头。
3. $ :用于匹配字符串的结尾。
4. * :用于匹配前面的字符出现0次或多次。
5. + :用于匹配前面的字符出现1次或多次。
6. ? :用于匹配前面的字符出现0次或1次。
7. | :用于表示或者的关系。
语法规则
除了元字符之外,正则表达式还包含了许多语法规则。下面是一些常见的语法规则:
1. 字符集:方括号([])内表示要匹配的字符集,可以使用连字符(-)表示范围。比如[0-9]表示匹配0到9之间的任意数字。
2. 分组:用小括号()来把多个元字符组合起来,形成一个整体。比如(ab)+表示匹配一个或多个连续的"ab"。
3. 反向引用:用反斜杠(\)加数字来引用前面的分组。比如(\w)\1表示匹配出现两次的任意单词字符。
4. 贪婪/非贪婪:在元字符后面加上问号(?)可以实现非贪婪模式。比如.*?表示匹配尽可能少的任意字符。
5. 零宽度断言:用于限定匹配的位置,但不会消耗任何字符。比如正向预查(?=)表示必须跟着某个模式,但不包含该模式;负向预查(?!)表示必须不跟着某个模式。
应用实例
下面我们通过一些实例来演示正则表达式的应用:
1. 匹配手机号码:^(13\d|14[579]|15[^4\D]|17[^49\D]|18\d)\d{8}$
java正则表达式规则
java正则表达式规则
Java正则表达式规则
一、什么是正则表达式
正则表达式(Regular Expression),简称正则,是一种用来匹配字符串的强大工具。它可以用来判断一个字符串是否符合某个模式,或者从字符串中提取出符合某个模式的部分。
二、正则表达式语法
1. 字符类
字符类用来匹配一个字符,可以使用方括号 [] 来指定字符的范围或多个字符的集合。例如,[abc]可以匹配字符'a'、'b'或'c',[a-z]可以匹配任意小写字母。
2. 元字符
元字符是正则表达式中具有特殊含义的字符。常用的元字符有:
- .:匹配任意单个字符,除了换行符。
- \d:匹配任意一个数字字符。
- \D:匹配任意一个非数字字符。
- \w:匹配任意一个字母、数字或下划线。
- \W:匹配任意一个非字母、数字或下划线。
- \s:匹配任意一个空白字符(包括空格、制表符、换行符等)。
- \S:匹配任意一个非空白字符。 - ^:匹配字符串的开始位置。
- $:匹配字符串的结束位置。
3. 量词
量词用来指定字符或字符类重复出现的次数。常用的量词有:
- *:匹配前一个字符或字符类出现0次或多次。
- +:匹配前一个字符或字符类出现1次或多次。
- ?:匹配前一个字符或字符类出现0次或1次。
- {n}:匹配前一个字符或字符类出现n次。
- {n,}:匹配前一个字符或字符类出现至少n次。
- {n,m}:匹配前一个字符或字符类出现至少n次、至多m次。
4. 分组和捕获
使用小括号 () 可以将一系列字符组成一个子表达式,方便进行分组和捕获。例如,(abc)可以匹配字符串"abc"。
5. 贪婪与非贪婪
正则表达式默认是贪婪模式,即尽可能多地匹配字符。可以在量词后面加上?来使用非贪婪模式,即尽可能少地匹配字符。
6. 边界匹配
边界匹配用来限定匹配字符串的边界。常用的边界匹配符有:
- \b:匹配单词的边界。
正则中的非的用法-概述说明以及解释
正则中的非的用法-概述说明以及解释
1.引言
1.1 概述
正则表达式是一种用于匹配和识别文本模式的强大工具,它在文本处理和搜索中起到至关重要的作用。正则表达式中的非操作符是一种特殊的操作符,它能够在匹配文本时排除某些特定模式,从而提高匹配的准确性和精度。
本文将重点介绍正则表达式中的非操作符的用法和实际应用,探讨其在文本处理中的重要性和作用。通过深入理解非操作符的功能和原理,可以更加灵活地运用正则表达式来处理各种复杂的文本匹配问题,提高文本处理的效率和准确性。
1.2文章结构
1.2 文章结构
本文主要分为引言、正文和结论三个部分。在引言部分,将对正则表达式中的非操作符进行概述,并介绍文章的结构和目的。在正文部分,将首先介绍正则表达式的基本概念和用途,然后着重讨论正则表达式中的非操作符的含义和使用方法。最后,将通过实际案例展示非操作符在正则表达式中的实际应用。在结论部分,将总结非操作符的作用和重要性,分享非操作符的使用技巧,并展望非操作符在未来的发展和应用前景。通过这样的结构安排,读者可以系统地了解正则表达式中的非操作符的用法和重要性。
1.3 目的
本文旨在探讨正则表达式中的非操作符的用法和应用。正则表达式作为一种强大的文本搜索工具,在处理字符串时具有十分灵活和高效的特性。而非操作符则是正则表达式中的一个重要组成部分,它可以帮助我们在匹配文本时排除某些特定的条件,从而实现更精确的匹配结果。
通过本文的分析和讨论,我们旨在帮助读者深入理解非操作符在正则表达式中的作用和原理,掌握其具体的用法和技巧。同时,我们也将展望非操作符在未来的发展和应用,探讨其在实际项目中的实际应用场景,帮助读者更好地应用非操作符解决实际问题。
总的来说,本文的目的是帮助读者更好地掌握正则表达式中的非操作符,提升他们在文本匹配和处理领域的技能和实践能力。
2.正文
2.1 正则表达式的基本概念和用途
正则表达式是一种强大的文本匹配工具,它可以用来描述字符串的模式。通过使用不同的元字符和操作符,可以构建复杂的模式,从而实现对文本的高效匹配和提取。
正则表达式或的用法
正则表达式或的用法
也表示匹配a或者b,而非匹配ab。
[0-9]表示匹配0-9中任意一个数字,[234]表示匹配2或者是3或者是4.
也就是说表达或的关系 可以用“|”,也可以用[]。
下面我们看下具体的例子:
左边单元格中的数据以空格区分,希望根据空格拆分到右边的单元格。
代码:
Sub 拆分()
Dim regx As Object, rng As Range, mat, m, n%
Set regx = CreateObject('vbscript.regexp')
With regx
.Global = True
.Pattern = '[0-9] '
For Each rng In [a1:a6]
Set mat = .Execute(rng)
For Each m In mat
n = n 1
Cells(rng.Row, n 1) = m
Next
n = 0 Next
End With
End Sub
.Pattern = '[0-9] '表示匹配0-9的之间的任意一个数字,“ ”号表示匹配数组一次或者是多次,这样就把每个以空格分割开的数字全匹配出来。
当然我们也可以写成 .Pattern = '\d '。
[0-9a-zA-z]表示从0-9任意数字、a到z任意字母,或者A到Z任意字母。
正则表达式用法详解
正则表达式⽤法详解
正则表达式之基本概念
在我们写页⾯时,往往需要对表单的数据⽐如账号、⾝份证号等进⾏验证,⽽最有效的、⽤的最多的便是使⽤正则表达式来验证。那什么是正则表达式呢?
正则表达式(Regular Expression)是⽤于描述⼀组字符串特征的模式,⽤来匹配特定的字符串。 它的应⽤⾮常⼴泛,特别是在字符串处理⽅⾯。其常见的应⽤如下:
验证字符串,即验证给定的字符串或⼦字符串是否符合指定的特征,例如,验证是否是合法的邮件地址、验证是否是合法的HTTP地址等等。查找字符串,从给定的⽂本当中查找符合指定特征的字符串,这样⽐查找固定字符串更加灵活。替换字符串,即查找到符合某特征的字符串之后将之替换。
提取字符串,即从给定的字符串中提取符合指定特征的⼦字符串。
第⼀部分:正则表达式之⼯具
正所谓⼯欲善其事必先利其器! 所以我们需要知道下⾯⼏个主要的⼯具:
第⼆部分:正则表达式之元字符
正则表达式中元字符恐怕是我们听得最多的了。元字符(Metacharacter)是⼀类⾮常特殊的字符,它能够匹配⼀个位置或者字符集合中的⼀个字符。 如.、\w等都是元字符。
刚刚说到,元字符既可以匹配位置,也可以匹配字符,那么我们就可以通过此来将元字符分为匹配位置的元字符和匹配字符的元字符。
A匹配位置的元字符---^、$、\b
即匹配位置的元字符只有^(脱字符号)、$(美元符号)和\b这三个字符。分别匹配⾏的开始、⾏的结尾以及单词的开始或结尾。它们匹配的都只是位置。
1.^匹配⾏的开始位置
如^zzw匹配的是以"zzw"为⾏开头的"zzw"(注意:我这⾥想要表达的是:尽管加了⼀个^,它匹配的仍是字符串,⽽不是⼀整⾏!),如果zzw不是作为⾏开头的字符串,则它不会被匹配。
2.$匹配⾏的结尾位置
如zzw$匹配的是以"zzw"为⾏结尾的"zzw"(同样,这⾥$只是匹配的⼀个位置,那个位置是零宽度,⽽不是⼀整⾏),如果zzw不是作为⾏的结尾,那么它不会被匹配。
通俗易懂的正则表达式语法详解
深入浅出之正则表达式(一)
前言: 半年前我对正则表达式产生了兴趣,在网上查找过不少资料,看过不少的教程,最后在使
用一个正则表达式工具RegexBuddy时发现他的教程写的非常好,可以说是我目前见过最好的
正则表达式教程。于是一直想把他翻译过来。这个愿望直到这个五一长假才得以实现,结果就有
了这篇文章。关于本文的名字,使用“深入浅出”似乎已经太俗。但是通读原文以后,觉得只有用“深入浅出”才能准确的表达出该教程给我的感受,所以也就不能免俗了。
本文是Jan Goyvaerts为RegexBuddy写的教程的译文,版权归原作者所有,欢迎转载。
但是为了尊重原作者和译者的劳动,请注明出处!谢谢!
1. 什么是正则表达式
基本说来,正则表达式是一种用来描述一定数量文本的模式。Regex代表Regular Express。
本文将用<>来表示一段具体的正则表达式。
一段文本就是最基本的模式,简单的匹配相同的文本。
2. 不同的正则表达式引擎
正则表达式引擎是一种可以处理正则表达式的软件。通常,引擎是更大的应用程序的一部分。
在软件世界,不同的正则表达式并不互相兼容。本教程会集中讨论Perl 5 类型的引擎,因为这
种引擎是应用最广泛的引擎。同时我们也会提到一些和其他引擎的区别。许多近代的引擎都很类
似,但不完全一样。例如.NET正则库,JDK正则包。
3. 文字符号
最基本的正则表达式由单个文字符号组成。如<>,它将匹配字符串中第一次出现的字
符“a”。如对字符串“Jack is a boy”。“J”后的“a”将被匹配。而第二个“a”将不会被
匹配。
正则表达式也可以匹配第二个“a”,这必须是你告诉正则表达式引擎从第一次匹配的地方
开始搜索。在文本编辑器中,你可以使用“查找下一个”。在编程语言中,会有一个函数可以使
你从前一次匹配的位置开始继续向后搜索。
类似的,<>会匹配“About cats and dogs”中的“cat”。这等于是告诉正则表
正则表达式的与或非
正则表达式的与或⾮
今天我的同事 问我,有没有办法⽤正则表达式匹配“不包含某个字符串”的⽂本,正好,我在写作的《正则表达式傻⽠书》中也提到了这类问题,就把这⼀
节放出来,给⼤家参考,也希望⼤家多提建议(尤其是配图⽅⾯)。
正则表达式的与或⾮
我们都知道,写正则表达式有点像搭积⽊,复杂的功能总可以拆分开来,由不同的元素(也就是⼦表达式)对应,再⽤合适的关系将它们组合起来,就可以
完成。在这⼀节,我们讲解常见的与或⾮关系的表达。
与
“与”是最简单的关系,它表⽰若⼲个元素必须同时相继出现,⽐如匹配单词cat,其实就是要求字符c、字符a和字符t必须同时连续出现。
正则表达式表达“与”关系⾮常简单,直接连续写出相继出现的元素就可以,我们可以想象,再各个元素之间,存在看不见的连接操作符·,⽐如上⾯匹配单词cat的正则表达式,就是『cat』,我们可以将它想象为『c·a·t』。
“与”关系也不限于字符之间,任何⼦表达式都可以⽤它来连接,如果我们把上⾯单词中的a替换为字符组『[au]』,表达式就变为『c[au]t』,你可以想象为
『c·[au]·t』。
或
“或”是正则表达式灵活性的重要体现,我们可以规定某个位置的⽂本的“多种可能”,⽐如要匹配cat或是cut,在正则表达式看来,就是“字符c,然后是a或
u,然后是t”。
如果“或”的多种可能都是单个字符(⼀般要求ASCII字符,中⽂字符等多字节字符的情况,可以参考本书专门论述的章节,此处仅以ASCII字符为例),就可
以⽤字符组来表达“或”的关系,⽐如上⾯的cat或者cut的情况,正则表达式写做『c[au]t』,其原理如下:
更复杂的情况是“或”的多种可能,并⾮都是单个字符,有些可能是多个字符。⽐如,我们可以看⼀个更复杂的例⼦,不仅要匹配cut,还要匹配c开头、t结尾
的单词chart、conduct和court。也就是说,在开头的c,结尾的t之间“可能”出现的是:u或har或onduc或our。
