正则表达式
文章平均质量分 72
正则表达式基础
吴声子夜歌
个人学习记录
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
正则指引——常用的正则表达式工具及资源
另外值得一提的是RegexTester,其中提供了针对.NET和Silverlight的正则表达式测试,在其中可以选择各种正则引擎(.NET、Client-side、Silverlight),在Source栏输入要处理的文本(也可以从外部文件或者URL导入),在Regular Expression栏输入正则表达式,单击Submit按钮,则会出现匹配结果。这个软件是之前提到的myregexp.com提供的,它是Eclipse的一个插件,用来调试Java的正则表达式。这个软件需要注册,但注册是免费的。原创 2026-08-14 17:29:27 · 234 阅读 · 0 评论 -
正则指引——常用的正则表达式
JavaScript代码在<script之后可能并不是空格,而是空白字符,再之后,可能是type=“text/javascript”,也可能是type=“application/javascript”,还可能用language取代type(实际上language是以前的写法,现在大都用type),甚至可能没有属性,直接是。ISBN有10位(ISBN-10)和13位(ISBN-13)两种长度,两者的主要区别是:ISBN-10的开头可能是ISBN-10,而ISBN-13的开头只可能是ISBN-13;原创 2026-08-14 17:07:03 · 247 阅读 · 0 评论 -
正则指引——常用语言中正则特性一览
原创 2026-08-13 23:52:55 · 22 阅读 · 0 评论 -
正则指引——Linux/UNIX
GNU出品的egrep等工具就属于ERE流派(更准确的名字是GNU ERE),但因为GNU已经对BRE做了不少扩展,所谓的GNU ERE其实只是一个说法,它的功能GNU BRE都有了,GNU ERE的主要区别在于元字符不需要转义。condition是判断条件,action是条件满足时所执行的操作,比如下面这条命令的意思就是,如果sample.txt中的某一行可以由正则表达式J匹配(也就是说,包含大写字母J),就输出这一整行($0的含义在下面讲解)。egrep和grep的名字不同,但并没有本质区别。原创 2026-08-13 23:42:18 · 416 阅读 · 0 评论 -
正则指引——Golang
前面说过,Golang的正则表达式采用“面向对象”的处理方法。也就是说,在使用正则表达式的相关功能之前,必须先创建正则表达式对象。然后可以调用其他正则表达式相关的函数。比如最常见的,检查一个字符串中是否存在能由正则表达式匹配的文本。Golang的正则表达式相关函数与其他语言中的有一个显著的区别,即它往往既提供了针对(接收参数为)string类型的函数,也提供了针对(接收参数为)byte[]类型的函数,相应的,返回的参数类型也分别为string或者byte[]。原创 2026-08-12 21:29:51 · 162 阅读 · 0 评论 -
正则指引——Objective-C
虽然本章没有讲解Swift,在这里还是要提一下Swift。Swift没有原生的正则表达式的类和方法,仍然沿用Objective-C中的NSRegularExpression,主要区别在于,标识匹配模式的常量包含在NSRegularExpression.Options中。不过考虑到实际使用时通常使用模式修饰符,这点差别可以忽略。Objective-C中的正则表达式在使用上与其他语言的正则表达式有所区别。原创 2026-08-12 16:08:59 · 196 阅读 · 0 评论 -
正则指引——Ruby
Ruby中的正则表达式对象是Regexp,一般使用/regex/来生成。如果习惯更为“正统”的模式,也可以用Regexp.new()来生成,参数是表达式对应的字符串。之前讲过,Ruby中有两种字符串,其中双引号字符串需要进行字符串转义处理,而单引号字符串不需要进行字符串转义处理。所以,作为正则表达式的字符串,最好使用单引号字符串。原创 2026-08-12 12:13:10 · 297 阅读 · 0 评论 -
正则指引——Python
Python中的正则表达式对象是RegexObject,它可以由正则表达式编译而来,常用的方法是re.compile(pattern)。如果要指定匹配模式,则可以在表达式中使用模式修饰符,也可以使用预定义常量。如果要同时指定多个匹配模式,则可以在表达式中连写模式修饰符,也可以用|运算符连接预定义常量。在Python的文档中,大多数函数是类似re.search(pattern,string)的形式,其中的pattern通常是正则表达式的字符串,可以将其视为“静态方法”。原创 2026-08-12 01:07:35 · 189 阅读 · 0 评论 -
正则指引——PHP
preg系列函数有可能用到预定义的常量,所以先介绍这些常量。原创 2026-08-11 22:48:54 · 196 阅读 · 0 评论 -
正则指引——JavaScript
JavaScript中的正则表达式对象是RegExp,生成它的方法主要有两种:使用/regex/分隔符表示法指定,或显式调用RegExp()构造函数。//简便形式,使用正则文字,不需要考虑字符串转义//指定多行模式直接以分隔符和正则文字表示,类似/regex/;或者以字符串作为参数,这时候就必须考虑字符串转义。如果使用前一种形式,必须在结束分隔符之后指定匹配模式;如果使用后一种形式,只能通过第二个参数指定匹配模式。//常见形式,使用正则文字。原创 2026-08-11 18:09:34 · 344 阅读 · 0 评论 -
正则指引——Java
(以下简称Pattern)和(以下简称Matcher)。Pattern对应正则表达式,一个Pattern与一个String对象关联,生成一个Matcher,它对应Pattern在String中的一次匹配;调用Matcher对象的find()方法,Matcher对象就会更新为下一次匹配的匹配信息。Pattern、String、Matcher对象之间的联系如下图所示,代码如下例所示。Java中正则表达式相关类的实际使用。原创 2026-08-11 00:27:21 · 174 阅读 · 0 评论 -
正则指引——常见问题的解决思路
要查找的字符串越多,正则表达式的效率就越低。相对来说,前者更明确,所以效率也更高些(当然这个例子最合适的是匹配“任意”字母的情况,如果要匹配的是确定单词,比如cat,明确写出就是[cC][aA][tT],明显不如cat直观,更不用说tomorrow之类的单词了)。如果你觉得这个表达式有点复杂,可以对它做一些整理:开头的\A定位在字符串的起始位置,而环视不会真正改变匹配的位置,每个环视判断完成,下一个环视仍然从字符串的起始位置开始,因此可以将各个环视中的\A去掉,但是末尾的\z不能去掉,否则(?原创 2026-08-10 11:25:51 · 227 阅读 · 0 评论 -
正则指引——匹配原理
自动售货机对应的有穷自动机模型如图所示,它包含6个状态,对应余额的6种可能,起始状态是“¥5”,结束状态是“¥0”,每个箭头代表一个转移函数(每样商品的价格为1元或者2元,所以每个转移函数上的文字或者是-1,或者是-2),在¥4、¥3、¥2、¥1状态下,都可以直接退币,所以有一个转移函数直达最终状态…在这台有穷自动机中,S0、S1、;仍然是上面的正则表达式,只是字符串变为"quoted"string,回溯的次数大大增加了,如果在结尾的"之后还有很长的文本,回溯的次数还可能大大增加,匹配过程如图所示。原创 2026-08-09 23:50:54 · 305 阅读 · 0 评论 -
正则指引——Unicode
在Unicode出现之前,各种系统的文字编码是各不相同的,比如中国大陆使用的是GB2312,中国台湾使用的是Big5,美国使用的是ASCII(ISO-8859-1),日本使用的是Shift JIS等。这些编码系统的作用,都是给每个字符分配一个数字(码值)作为编码,然后进行码值-字符和字符-码值的双向映射操作。比如在ASCII编码中,字母C的编码是(十进制的)67,又比如在GB2312编码中,汉字“正”的编码是(十进制的)54781。这样的标准在本地区使用当然没有问题,但如果要跨地区交流就会遇到困难,因为同原创 2026-08-09 18:05:00 · 166 阅读 · 0 评论 -
正则指引——转义、处理形式、优先级、回车和换行
仔细观察面向对象式处理可以发现,在面向对象式处理中,一般会出现两个对象:一个是单独对应正则表达式的,可以叫作“正则表达式对象”,比如Java中的Pattern、.NET中的Regex、Python中的RegexObject、Objective-C中的NSRegularExpression、Golang中的Regexp;其他语言虽然不支持\Q…但是,多选结构并非必须与括号连用,如果没有括号,单独出现竖线|,也可以实现多选结构的功能,比如正则表达式ab|cd,它能匹配的字符串和(ab|cd)是完全一样的。原创 2026-08-09 15:55:21 · 260 阅读 · 0 评论 -
正则指引——匹配模式
比较两种指定形式,模式修饰符较为通用,因为在各种语言中写法基本相同,而预定义常量在不同语言中写法不同。不过,两种形式的效果是相同的:无论以哪种方式,只要指定了不区分大小写模式,正则表达式在匹配时,就不会区分同一个字母的大小写形式。原创 2026-08-09 01:29:25 · 368 阅读 · 0 评论 -
正则指引——断言
如果指定了多行模式,原创 2026-08-09 00:08:53 · 357 阅读 · 0 评论 -
正则指引——括号
关于括号的分组功能,最后来看E-mail地址的匹配:E-mail地址以@分隔为两段,a之前的是用户名(username),之后的是主机名(hostname),用户名一般只允许出现数字和字母(现在有些邮件服务商也允许用户名中出现点号等字符了,这种情况复杂一些,此处不做考虑),而主机名则是类似mail.google.com、mail.163.com之类的字符串。点号.的匹配非常容易,用.就可以,所以暂且忽略它,只考虑匹配这个数值的问题,而且因为4段IP地址的取值范围是相同的,只考虑其中一段的匹配即可。原创 2026-08-08 17:47:02 · 252 阅读 · 0 评论 -
正则指引——量词
HTML是一种“标签语言”,它包含各种各样的tag(标签),比如<head>、<img>、<table>等,这些tag的名字各异,形式却相同:从<开始,到>结束,在<和>之间有若干字符,“若干”的意思是长度不确定,但不能为0(<>并不是合法的tag),也不能是>字符。如果要用一个正则表达式匹配所有的tag,需要用<匹配开头的<,用>匹配结尾的>,用。表格的tag是<table>,行的tag是<tr>,单元的tag是<td>,所以,它们可以分别用下面的表达式匹配,请注意其中的。原创 2026-08-08 00:10:22 · 194 阅读 · 0 评论 -
正则指引——字符组
根据惯例,字符组的范围表示法用来表示一类字符(数字字符是一类,字母字符也是一类),所以虽然[0-9]、[a-z]都是很好理解的,但[0-z]却很难理解,不熟悉ASCII编码表的人甚至不知道这个字符组还能匹配大写字母,更何况,在码值48到122之间,除去数字字符(码值48~57)、小写字母(码值97~122)、大写字母(码值65~90),还有不少标点符号(参见下表),从字符组[0-z]中却很难看出来,使用时就容易引起误会,例所示的程序就很可能让人感觉莫名其妙。在匹配中,它们有着特殊的意义。原创 2026-08-07 17:22:35 · 221 阅读 · 0 评论 -
正则表达式参考
QED是Ken Thompson对MIT的Compatible Time-Sharing System上运行的一个编辑器重写后的版本,它是计算领域中最早的正则表达式实现程序之一。表A-1是从1970年贝尔实验室备忘录中选取的,它列出了QED中的正则表达式特性。下表列出了以\p{属性}或\P{属性}形式使用的字符属性名称。下表列出了以\p{属性}或\P{属性}形式使用的语言脚本名称。下表所示的是在正则表达式中匹配控制字符的一种方式。下表列出的是Unicode中的各种空白字符。下表列出了各种空白符的简写式。原创 2026-08-06 22:47:38 · 126 阅读 · 0 评论 -
正则表达式——环视
但只有模式的第一部分(ancyent)是被标亮的,环视模式(Marinere)不会标亮。因为正后顾的模式是匹配的条件,不会包含在匹配结果中。假设要匹配单词ancyent,且要求紧随其后的单词是marinere(为与文件中的单词一致,我采用了古代拼写法)。这意味着要匹配某个模式时,需要在它后面找不到含有给定前瞻模式的内容。只有一个字符发生了变化:正前瞻的等号(=)变为反前瞻的感叹号(!同样,它有一个小于号(<),提醒后顾的是哪个方向。以上就是对前瞻和后顾的简单介绍,这是现代正则表达式的一个重要特性。原创 2026-08-06 21:33:40 · 121 阅读 · 0 评论 -
正则表达式——量词
尝试匹配时,它会选定尽可能多的内容,也就是整个输入。占有式匹配很像贪心式匹配,它会选定尽可能多的内容。它不会放弃所找到的内容,它很自私,这也是把它称为占有式(possessive)的原因。它从目标的起始位置开始尝试寻找匹配,每次检查字符串的一个字符,寻找它要匹配的内容。如果将加号去掉,它会找到所有的0,因为它变回贪心式匹配了。当你知道文本中的内容时,就知道在哪里可以找到匹配,这时你应该会使用占有量词。占有式的匹配看起来和贪心式的匹配是一样的,但没有回溯。它将会以贪心的方式匹配主文本中的所有字符(数字)。原创 2026-08-06 21:07:49 · 174 阅读 · 0 评论 -
正则表达式——匹配Unicode和其他字符
在%之后,你可以使用x或X来匹配0-255(0-FF)范围内的值,使用u匹配256-65535(100-FFFF)范围内的四位十六进制数,还可以用U来匹配65536-2147483647(10000-7FFFFFFF)范围内的八位十六进制数。在示例代码库中,你会找到ascii.txt文件(共128行),包含了所有的ASCII字符,一个字符占一行(所以有128行)。在某些实现(比如像Perl)中,还可以匹配Unicode的字符属性。这是单词pond(池塘)所对应的日文字符的代码点,该字会在下方被标亮。原创 2026-08-06 18:21:01 · 164 阅读 · 0 评论 -
正则表达式——字符组
在其Preference(偏好设置)面板中,我将Regular Expression Syntax(正则表达式语法)改为“Java”,而在Font中(在Format里),为了阅读方便,我将字体大小设为24。对字符组取反会匹配与字符组内容不匹配的字符。事实上,字符组的另一个名称就是字符集(character set)。该字符组起始位置的脱字符(^)的意义就是:“不,我不想匹配这些字符。这匹配a到z之间的字符,但其中m到r之间的字符除外(如图所示)。还有很多POSIX字符组,如下表示。原创 2026-08-06 17:50:08 · 201 阅读 · 0 评论 -
正则表达式——选择、分组和后向引用
多数情况下,提到正则表达式中的子模式(subpattern),就是指分组中的一个或多个分组。多数情况下,子模式中的条件能得到匹配的前提是前面的模式得到匹配,但也有例外。如果你使用的正则表达式引擎进行回溯操作,这种分组就可以将回溯操作关闭,但它只针对原子分组内的部分,而不针对整个正则表达式。在你并不想引用分组的时候,可以使用它。这里\1或$1引用的是第一个捕获的分组,而\2或$2引用第二个捕获的分组,以此类推。这些指令在文本中出现其他指令(比如\l或\E,作为文字使用的字符串的结尾)之前都是起作用的。原创 2026-08-06 17:07:38 · 232 阅读 · 0 评论 -
正则表达式——边界
就像^和$一样,\b是个零宽度断言,表面上它会匹配空格或者是行起始,而实际上它匹配的是个零宽度的不存在的东西。但在有些情况下,这种语法就很有用,因为它不会像\b那样匹配任意单词边界,而是允许你分别匹配单词的开头或结尾。可以看到它匹配了小写字母e,而匹配的字母e的两边都是其他字母或者是非单词字符。这一命令会匹配一行(主题词)尾部的MARINERE或Marinere,之后是任何可选字符,在本例中可选字符就是标点符号或者字母S。这个写法不是在所有的正则表达式程序中都可以使用的,但可以在Perl和PCRE中使用。原创 2026-08-06 15:23:09 · 268 阅读 · 0 评论 -
正则表达式——简单的模式匹配
此外,在包括Perl在内的多数实现程序中,还可以使用\1表示后向引用,但是RegExr只支持$1、$2、$3这样的方式。它匹配了连续多组的八个字符,头尾相连,只有目标文本的最后几个字符除外。匹配字符串字面值的方法就是使用普通的字符。\D与\w的区别是\D会匹配空格、标点符号(引号、连字符、反斜杠、方括号)等字符,而\w却不会,它只匹配字母、数字和下划线。这个表达式有更强的特指性(请记住特指性,specificity,这个概念很重要),它匹配单词ANCYENT,也就是ancient的旧式拼写形式。原创 2026-08-06 00:51:52 · 231 阅读 · 0 评论 -
正则表达式——概述和入门
1、从Regexpal开始2、匹配北美电话号码3、用字符组来匹配数字4、使用字符组简写式5、匹配任意字符6、捕获分组和后向引用7、使用量词8、括选文字符。原创 2026-08-05 22:58:27 · 110 阅读 · 0 评论 -
正则表达式——常见问题的正则表达式解决方案
根据这一方案,北美地区(美国、加拿大、加勒比海地区大部以及其他几个地区)的电话号码由一个3位数的区号和一个7位数的号码构成(这7位数字又分成一个3位数的局号和一个4位数的线路号,局号和线路号之间用连字符分隔)。不过,ZIP+4编码的使用是可选的,所以对ZIP编码进行检查通常必须同时照顾到5位数字的ZIP编码和9位数字的ZIP+4编码(ZIP+4编码中的后4位数字与前5位数字之间要用一个连字符隔开)。不过,一个能满足上述要求的模式会十分的复杂,因而比较简单的\d{3}-\d{2}-\d{4}更常见一些。原创 2026-08-05 16:58:02 · 189 阅读 · 0 评论 -
正则表达式——常见应用软件和编程语言中的正则表达式
注意 Sun公司花了很长的时间才在Java里实现了正则表达式支持,而不少软件团队在几年前就开发出了各种非官方的正则表达式实现。注意 JavaScript 2里的正则表达式处理(Mozilla和另外几种比较新的浏览器可以支持)与JavaScript 1.x向后兼容并提供了更多的功能。Java对正则表达式的支持是从1.4版本开始的,此前的JRE(Java Runtime Environment, Java运行环境)版本不支持正则表达式。PHP通过它的PCRE组件提供了与Perl相兼容的正则表达式支持。原创 2026-08-05 15:14:56 · 157 阅读 · 0 评论 -
正则表达式——嵌入条件
这样一来,33333-将被排除在最终的匹配结果之外(它有一个连字符,所以满足给定条件,但那个连字符的后面没有必须出现在那里的4位数字)。(123)456-7890和123-456-7890都是可接受的北美电话号码格式,而1234567890、(123)-456-7890和(123-456-7890)虽然都包含着数目正确的数字字符,但它们的格式都不对。原始文本中的最后两行不与这个模式匹配,但第3行和第4行与之匹配——这是不正确的,第3行的)后面多了一个-,第4行少了一个配对的右括号)。原创 2026-08-05 14:13:03 · 191 阅读 · 0 评论 -
正则表达式——前后查找
这两个模式所匹配的东西是一样的——都是紧跟在协议名后面的那个:,它们之间的区别只是被匹配到的:字符有没有出现在最终的匹配结果里而已。在遇到这类问题的时候,你真正需要的是这样一个模式,它包含的匹配本身并不返回,而是用于确定正确的匹配位置,它并不是匹配结果的一部分。到目前为止正如你看到的那样,向前查找和向后查找通常用来匹配文本,其目的是为了确定将被返回为匹配结果的文本的位置(通过指定匹配结果的前后必须是哪些文本)。注意 向前查找(和向后查找)匹配本身其实是有返回结果的,只是这个结果的字节长度永远是0而已。原创 2026-08-05 12:30:06 · 183 阅读 · 0 评论 -
正则表达式——回溯引用:前后一致匹配
(\d{3})(-)(\d{3})(-)(\d{4})用来匹配一个电话号码,它被划分为5个子表达式(5个组成部分):第1个子表达式(\d{3})匹配前3位数字,第2个子表达式(-)匹配-字符,等等。这是一个回溯引用,而它引用的正是前面划分出来的那个子表达式:当(\w+)匹配到单词of的时候,\1也匹配单词of;匹配任何一级标题的开始标签(具体到这个例子,它匹配到了<H1>和<H2>),</[hH][1-6]>匹配任何一级标题的结束标签(具体到这个例子,它匹配到了</H1>和</H2>)。原创 2026-08-05 01:34:23 · 237 阅读 · 0 评论 -
正则表达式——使用子表达式
我们在前面学习了如何匹配一个字符的连续多次重复。正如我们讨论的那样,\d+将匹配一个或多个数字字符,而https?😕/将匹配http://或https://。在这两个例子里(事实上,是在我们此前见过的所有例子里),用来表明重复次数的元字符(如?或*或{2},等等)只作用于紧挨着它的前一个字符或元字符。我们来看一个例子。有些短语(例如Windows 2000)虽然由多个单词构成,但其实是一个整体。有许多HTML程序员喜欢让这类短语在浏览器里显示在同一行上。原创 2026-08-05 00:22:30 · 202 阅读 · 0 评论 -
正则表达式——位置匹配
不过,虽然这两种元字符可以提供粒度更细的控制,但支持它们的正则表达式引擎却并不多见(据笔者所知,egrep程序是支持<和>的,但许多其他文本匹配工具则不支持它们)。简单地说,\b匹配的是一个这样的位置,这个位置位于一个能够用来构成单词的字符(字母、数字和下划线,也就是与\w相匹配的字符)和一个不能用来构成单词的字符(也就是与\W相匹配的字符)之间。字符串边界有着类似的用途,只不过是用来进行与字符串有关的位置匹配而已(字符串的开头、字符串的结束、整个字符串,等等)。>匹配到的是整个文本的第2行。原创 2026-08-04 23:28:10 · 155 阅读 · 0 评论 -
正则表达式——重复匹配
这个正则表达式本身没有任何错误,可它几乎没有任何实际的用处——它只能匹配a@b.c形式的电子邮件地址(虽然在语法方面没有任何问题,但这显然不是一个合法的地址)。不匹配零个字符的情况)。简单地在http的后面加上一个s*(s的零次或多次重复)并不能真正解决这个问题,因为那会使得httpsssss://(如此开头的URL地址显然是不合法的)也被认为是一个合法的匹配。答案是使用这些元字符的“懒惰型”版本(“懒惰”在这里的含义是匹配尽可能少的字符——与“贪婪型”元字符的行为模式刚好相反)。原创 2026-08-04 21:35:23 · 193 阅读 · 0 评论 -
正则表达式——使用元字符
因为[和]在正则表达式里是用来定义一个字符集合(而不是[和]本身)的元字符,所以,myArray[0]将匹配myArray后面跟着一个该集合成员的情况,而那个集合只有一个成员0。到目前为止,你已经见过如何匹配特定的字符、如何匹配任意单个字符(用.)、如何匹配多个字符中的某一个(用[和])以及如何进行取非匹配(用^)。\匹配\,总共找到了4个匹配。在前一章里使用的模式是重复写出的6个[0-9A-Fz-f]字符集合,把那6个[0-9A-Fz-f]全部替换为[[:xdigit:]]就得到这里的模式。原创 2026-08-04 17:43:49 · 233 阅读 · 0 评论 -
正则表达式——匹配一组字符
在使用[和]定义的字符集合里,这两个元字符之间的所有字符都是该集合的组成部分,字符集合的匹配结果是能够与该集合里的任意一个成员相匹配的文本。在这个例子里,我们改用了另外一个模式,这个模式的匹配对象是:第1个字符必须是n或s,第2个字符必须是a,第3个字符可以是任何一个数字(因为我们使用了字符集合[0123456789])。换句话说,除了那个字符集合里的字符,其他字符都可以匹配。并不是最正确的答案。的效果将作用于给定字符集合里的所有字符或字符区间,而不是仅限于紧跟在^字符后面的那一个字符或字符区间。原创 2026-08-04 16:11:44 · 208 阅读 · 0 评论 -
正则表达式——匹配单个字符
在上面的例子里,我们使用的正则表达式并不能匹配整个文件名,它只匹配了文件名的一部分。当然,像这样使用正则表达式是一种浪费,但把它作为我们学习正则表达式的起点还是很不错的。绝大多数正则表达式的实现都提供了一种能够把所有的匹配结果全部找出来的机制(通常返回为一个数组或是其他的专用格式)。前面见到的正则表达式都是些静态的纯文本,它们根本体现不出正则表达式的威力。我们再来看一个使用了相同原始文本的例子:把以na(表示北美)或sa(表示南美)开头的文件(不管它们后面跟着一个什么数字)找出来。原创 2026-08-04 14:41:48 · 251 阅读 · 0 评论
分享