当前位置:文档之家› 正则表达式入门学习

正则表达式入门学习

正则表达式入门学习
正则表达式入门学习

正则表达式(Regular Expression)是强大、便捷、高效的文本处理工具。正则表达式本身,加上如同一门袖珍编程语言的通用模式表示法(general pattern notation),赋予使用者描述和分析文本的能力。配合上特定工具提供的额外支持,正则表达式能够添加、删除、分离、叠加、插入和修整各种类型的文本和数据。

正则表达式的使用难度只相当于文本编辑器的搜索命令,但功能却与完整的文本处理语言一样强大。本书将向读者展示正则表达式提高生产率的诸多办法。它会教导读者如何学会用正则表达式来思考(t hink regular expressions),以便于掌握它们,充分利用它们的强大功能。

如果使用当今流行的程序设计语言,解决重复单词问题的完整程序可能仅仅只需要几行代码。使用一个正则表达式的搜索和替换命令,读者就可以查找文档中的重复单词,并把它们标记为高亮。加上另一个,你可以删除所有不包含重复单词的行(只留下需要在结果中出现的行)。最后,利用第三个正则表达式,你可以确保结果中的所有行都以它所在文件的名字开头。在下一章里,我们会看到用Perl和Java编写的程序。

宿主语言(例如Perl、Java以及https://www.doczj.com/doc/258027591.html,)提供了外围的处理支持,但是真正的能力来自正则表达式。为了驾驭这种语言,满足自己的需求,读者必须知道如何构建正则表达式,才能识别符合要求的文本,同时忽略不需要的文本。然后,就可以把表达式和语言支持的构建方式结合起来,真正处理这些文本(加入合适的高亮标记代码,删除文本,修改文本,等等)。

解决实际问题

Solving Real Problems

2

第1章:正则表达式入门掌握正则表达式,可能带来超乎你之前想象的文本处理能力。每一天,我都依靠正则表达式解决各种大大小小的问题(通常的情况是,问题本身并不复杂,但没有正则表达式就成了大问题)。

要说明正则表达式的价值,可以举一个用正则表达式解决大而重要的问题的例子,但是它不一定能代表正则表达式在平时解决的那些“不值一提”(uninteresting)的问题。这里的“不值一提”是指这类问题并不能成为谈资,可是不解决它们,你就没法继续干活。

举个简单的例子,我需要检查许多文件(事实上,本书的手稿存放在70个文件中),确保每一行中‘SetSize’出现的次数与‘ResetSize’的一样多。为了应付复杂的情况,我还需要考虑大小写的情况(举例来说,‘setSIZE’也算做‘SetSize’)。人工检查32 000行文字显然不现实。

解决实际问题 3 即便使用文本编辑器的“单词查找”功能,也不够方便,尤其是对所有文件进行同样的操作,何况还需要考虑所有可能的大小写情况。

正则表达式就是解决这个问题的灵丹妙药。只需要一个简单的命令,我就能够检查所有的文件,获得我需要知道的结果。时间是:写命令大概15秒,检索所有的数据实际只花了2秒。这真是棒极了(如果您想知道这是怎么做到的,不妨现在就翻到第36页)!

再举一个例子,我曾帮助一个朋友处理远端机器上的某些E-mail,他希望我把他邮箱文件中的消息作为列表发送给他。我可以把整个文件导入文本编辑器,手工删除所有信息,只留下邮件头中的几行,作为内容的列表。尽管文件不是很大,连接速度也不算慢,这样的任务还是很耗费时间而且很乏味。而且,窥见他的邮件正文,也令我尴尬。

正则表达式再一次提供了帮助!我用一个简单的命令(使用本章稍后提到的一个常用工具egrep)显示每封邮件的From:和Subject:字段。为了告诉egrep我需要提取哪些行,我使用了正则表达式「^(From|Sbuject):」。

朋友得到这个列表之后,让我找一封特殊的(5 000行!)邮件。使用文本编辑器或者邮件系统来提取一封邮件无疑非常耗时。相反,我借助另一个工具(叫做sed),同样使用正则表达式来描述文件中我需要的内容。这样,我能迅速而方便地提取和发送需要的邮件。

使用正则表达式节省下来的时间或许并不能让人“激动”,但总比把时间消耗在文本编辑器中

4

第1章:正则表达式入门要好。如果我不知道有正则表达式这种玩意儿,根本就不会想到还有别的解决办法。所以,这个故事告诉我们,正则表达式和相关的工具能够让我们以可能未曾想过的方式来解决问题。

一旦掌握了正则表达式,你就会知道到它简直是工具中的无价之宝,你也难以想象之前那些没有正则表达式的日子是怎么度过的(注1)。

全面掌握正则表达式是很有用的。本书提供了掌握这种技能所需要的信息,我同时也希望,这本书也提供了促使你学习的动机。

注1:用过TiV o(译注:TiV o是一种数字录像机,具有许多神奇的功能,例如根据用户的偏好自动录制节目,自动跳过电视台的广告,等等)的人都体验过这种感觉。

作为编程语言的正则表达式 5

作为编程语言的正则表达式

Regular Expressions as a Language

如果没有正则表达式相关经验,读者可能无法理解上个例子中正则表达式「^(From|Subject):」

的意义,但是这个表达式并没有什么神奇之处。其实魔术本身也不神奇,只是缺乏训练的

普通观众不明白魔术师掌握的那些技巧而已。如果你也懂得如何在手中藏一张牌,那么,

熟练之后,你也可以“变魔术”。外语也是这样——一旦掌握了一门外语,你就不会觉得它像

天书了。

以文件名做类比

The Filename Analogy

选择这本书的读者,大概对“正则表达式”多少有点认识。即便没有,也应该熟悉其中的基

本概念。

我们都知道,report.txt是一个文件名,但是,如果你用过Unix或者DOS/Windows的话,

就会知道“*.txt”能够用来选择多个文件。在此类文件名(称为“文件群组”file globs或者“通

配符”wildcards)中,有些字符具有特殊的意义。星号表示“任意文本”,问号表示“任意单个字

符”。所以,文件群组“*.txt”以能够匹配字符的「*」符号开头,以普通文字「.txt」结尾,所

以,它的意思是:选择以任意文本开头,以.txt结尾的所有文件。

6

第1章:正则表达式入门大多数系统都提供了少量的附加特殊字符(additional special characters),但是,总的来说,这些文件名模式(filename patterns)的表达能力还很有限。不过,因为这类问题的领域很狭窄——只涉及文件名,所以这算不上缺陷。

不过,处理普通的文本就没有这么简单了。散文、诗、程序代码、报表、HTML、表格、单词表……到你想得出的任何文本。如果某种特殊的需求足够专业,例如“选择文件”,我们可以发明一些特殊的办法和工具来解决问题。不过,近年来,一种“通用的模式语言”(generalized pattern language)已经发展起来,它功能强大,描述能力也很强,可以用来解决各种问题。不同的程序以不同的方式来实现和使用这种语言,但是综合来说,这种功能强大的模式语言和模式本身被称为“正则表达式”(regular expression)。

作为编程语言的正则表达式7

以语言做类比

The Language Analogy

完整的正则表达式由两种字符构成。特殊字符(special characters,例如文件名例子中的*)称为“元字符”(metacharacters),其他为“文字”(literal),或者是普通文本字符(normal text characters)。正则表达式与文件名模式(filename pattern)的区别就在于,正则表达式的元字符提供了更强大的描述能力。文件名模式只为有限的需求提供了有限的元字符,但是正则表达式“语言”为高级应用提供了丰富而且描述力极强的元字符。

为了便于理解,我们可以把正则表达式想象为普通的语言,普通字符对应普通语言中的单词,而元字符对应语法。根据语言的规则,按照语法把单词组合起来,就会得到能传达思想的文本。在E-mail的例子中,我用正则表达式「^(From|Subject):」来寻找以‘From:’或者‘Subject:’开头的行。下画线标注的就是特殊字符,稍后我们将解释它们的含义。

就像学习任何一门外语一样,第一眼看上去,正则表达式很不好理解。这也是那些对它只有粗浅了解或者根本不了解的人觉得正则表达式很神奇的原因。但是,就像学日语的人很快就能理解正規表現は簡単だよ!(注2)一样,读者很快也能够彻底明白下面这个正则表

注2:这句话的意思是,“正则表达式很简单!”。有趣的是,就像第3章介绍的,“正则表达式”这个术语来自形式代数。问我这本书的主题的人,如果对这个概念不熟悉,听到“正则表达式”

多半会满脸茫然。正则表达式在日文中写作,正規表現,同它的英文名字一样不好理解,但是我用日语来回答通常会令人反应更奇怪。因为在日文中,“正则”(regular)很不幸地与一个表示“生殖器官”的医学术语发音相同。读者可以想象,在我没有解释之前,人们会有

8

第1章:正则表达式入门达式的含义:

s!([0-9]+(\.[0-9]+){3})!$1!

这个例子取自一个Perl脚本,我的编辑器用它来修改手稿。手稿的作者错误地使用了这个tag来标注IP地址(类似209.204.146.22这样由数字和点号构成的字符串)。其中的奥妙就在于使用Perl的文本替换命令,使用:

([0-9]+(\.[0-9]+){3})

把IP地址两端的tag替换为,而不改动其他的标签。在后面的章节中,读者会了解这个表达式的构造细节,然后就能按照自己的需求,在自己的应用程序或者开发语言中应用这些技巧。

多么惊奇。

正则表达式的思维框架9 本书的目的

你或许不需要重复把替换为的工作,不过很可能需要解决“把这些文字替换为那些文字”的问题。本书的目的不是提供具体问题的解决办法,而是教会读者利用正则表达式来思考,解决遇到的各种问题。

正则表达式的思维框架

The Regular-Expression Frame of Mind

我们将会看到,完整的正则表达式由小的构建模块单元(building block unit)组成。每个单独的构建模块都很简单,不过因为它们能够以无穷多种方式组合,将它们结合起来实现特殊目标必须依靠经验。所以,本章提供了有关正则表达式的若干概念的总体描述。这一章并没有艰深的内容,而是为本书其余章节的知识打下基础,在深入探索正则表达式之前,把相关事宜阐释清楚。

某些例子看起来可能有点无聊(因为它们确实无聊),但它们代表了一类需要完成的任务,只是读者目前可能还没有意识到。即使觉得每个例子的意义都不大也不必担心,慢慢理解其中的道理就好。这就是本章的目的。

对于有部分经验的读者

If You Have Some Regular-Expression Experience

10

第1章:正则表达式入门如果读者已经熟悉正则表达式,这些综述便没有太大价值,但务必不要忽略它们。你或许明白某些元字符的基本意义,但某些思维和看待正则表达式的方式可能是你不了解的。

就像真正懂演奏和仅仅会弹奏之间差别迥异一样,了解正则表达式和真正理解正则表达式并不是一回事。某些内容可能会重复读者已经了解的知识,但方式可能与之前的不同,而且这些方式正是真正理解正则表达式的第一步。

检索文本文件:Egrep

Searching Text Files: Egrep

文本检索是正则表达式最简单的应用之一——许多文本编辑器和文字处理软件都提供了正则表达式检索的功能。最简单的就是egrep。在指定了正则表达式和需要检索的文件之后,egrep会尝试用正则表达式来匹配每个文件的每一行,并显示能够匹配的行。

正则表达式的思维框架11 许多系统——例如DOS、MacOS、Windows、Unix等等——都对应有免费提供的egrep。在本书的网页https://www.doczj.com/doc/258027591.html,上可以找到获得对应读者操作系统的egrep拷贝的链接。

回到第3页的E-mail的例子,真正用来从E-mail文件中提取结果的命令如图1-1所示。egrep 把第一个命令行参数视为一个正则表达式,剩下的参数作为待搜检索的文件名。注意,图1-1中的单引号并不是正则表达式的一部分,而是根据command shell需要添加的(注3)。使用egrep时,我通常用单引号来包围正则表达式。如果要在支持对正则表达式提供了完整支持的程序设计语言中使用正则表达式——这是下一章开头的内容,重要的问题是知道特殊字符有哪些,具体文本是什么,针对什么对象(什么表达式,什么工具软件),以及按何种顺序解释这些字符。

注3:command shell是操作系统的一部分,用来接收用户的命令,执行用户请求的程序。在我使用的shell中,单引号用来分组命令参数,告诉shell不必关心其中的内容。如果不这样写,shell或许会认为,我在正则表达式中使用的‘*’是需要解释的文件名模式的一部分。而这不是我的意思,所以我用单引号在shell中“屏蔽(hide)”元字符。使用https://www.doczj.com/doc/258027591.html,或者CMD.EXE的Windows用户可能需要使用双引号而不是单引号。

12

第1章:正则表达式入门图1-1:通过命令行调用egrep

我们马上就能明白,这个正则表达式的各个部分都是什么意思,但已经知道某些字符具有特殊含义的读者或许能够猜出大概了。在这里,「^」和「|」都是正则表达式的元字符,它们与其他字符结合起来,实现我们期望的功能。

如果一个正则表达式不包括任何egrep支持的元字符,它就成了一个简单的“纯文本”检索。例如,在一个文件中检索「cat」,会显示任何包含c a t这3个连续字母的行。例如,它包括所有出现了vacation的行。

Egrep元字符13 即便这行文本中不包含单词cat,vacation中包含的c a t序列仍然符合匹配条件。如果某行中包含vacation,egrep就会把它显示出来。关键就在于,此处进行的正则表达式搜索不是基于“单词”的——egrep能够理解文件中的字节和行,但它完全不理解英语(或者其他任何语言)的单词、句子、段落,或者是其他复杂概念。

Egrep元字符

Egrep Metacharacters

现在我们来看egrep中支持正则表达式功能的元字符。我会用几个例子来简要介绍它们,把详细的例子和描述留到后面的章节。

印刷体例在开始之前,请务必回顾前言第V页上解释的体例说明。本书使用了一些新的文字形式,所以某些体例读者初次接触可能并不熟悉。

行的起始和结束

Start and End of the Line

或许最容易理解的元字符就是脱字符号「^」和美元符号「$」了,在检查一行文本时,「^」代表一行的开始,「$」代表结束。我们曾经看到,正则表达式「cat」寻找的是一行文本中任意位置的c a t,但是「^cat」只寻找行首的c a t——「^」用来把匹配文本(这个表达式的其他部分匹配的字符)“锚定”(anchor)在这一行的开头。同样,「cat$」只寻找位于行末的c a t,例如

14

第1章:正则表达式入门以scat结尾的行。

读者最好能养成按照字符来理解正则表达式的习惯。例如,不要这样:

「^cat」匹配以cat开头的行

而应该这样理解:

「^cat」匹配的是以c作为一行的第一个字符,紧接一个a,紧接一个t的文本。

这两种理解的结果并无差异,但按照字符来解读更易于明白新遇到的正则表达式的内部逻辑。egrep会如何解释「^cat$」、「^$」和单个的「^」呢? 请翻到下页查看答案。

脱字符号和美元符号的特别之处就在于,它们匹配的是一个位置,而不是具体的文本。当然,有很多方式可以匹配具体文本。在正则表达式中,除了使用「cat」之类的普通字符,还可以使用下面几节介绍的元字符。

Egrep元字符15

字符组

Character Classes

匹配若干字符之一

如果我们需要搜索的是单词“grey”,同时又不确定它是否写作“gray”,就可以使用正则表达式结构体(construct)「[…]」。它容许使用者列出在某处期望匹配的字符,通常被称作字符组(character class(译注2))。「e」匹配字符e,「a」匹配字符a,而正则表达式「[ea]」能匹配a 或者e。所以,「gr[ea]y」的意思是:先找到g,跟着是一个r,然后是一个a或者e,最后是一个y。我很不擅长拼写,所以总是用正则表达式从一大堆英文单词中找到正确的拼写。我经常使用的一个正则表达式是「sep[ea]r[ea]te」,因为我从来都记不住这个单词到底是写作“seperate”,“separate”,“separete”,还是别的什么样子。匹配的结果的就是正确的拼法,而正则表达式就是我的领路人。

请注意,在字符组以外,普通字符(例如「gr[ae]y」中的「g」和「r」)都有“接下来是(and then)”的意思——“首先匹配「g」,接下来是「r」……”。这与字符组内部的情况是完全相反的。字符组的内容是在同一个位置能够匹配的若干字符,所以它的意思是“或”。

来看另一个例子,我们还必须考虑单词的第一个字母为大写的情况,例如「[Ss]mith」。请记住,这个表达式仍然能够匹配内嵌在其他单词里头的smith(或者是Smith),例如blacksmith。在综述阶段,我不打算为这种情况费太多笔墨,但是这确实是某些新手遇到的问题的根源。等了解了更多的元字符以后,我会介绍一些办法来解决单词嵌套的问题。在一个字符组中可以列举任意多个字符。例如「[123456]」匹配1到6中的任意一个数字。这个字符组可以作为「」的一部分,用来匹配

等等。在搜索HTML代码的头文件时这非常有用。

在字符组内部,字符组元字符(character-class metacharacter)‘-’(连字符)表示一个范围:「」与「」是完全一样的。「[0-9]」和「[a-z]」是常用的匹配数字和小写字母的简便方式。多重范围也是容许的,例如「[0123456789abcdefABCDEF]」可以写作「[0-9a-fA-F]」(或者也可以写作「[A-Fa-f0-9]」,顺序无所谓)。这3个正则表达式非常适用于处理十六进制数字。我们还可以随心所欲地把字符范围与普通文本结合起来:「[0-9A-Z_!.?]」能够匹配一个数字、大写字母、下画线、惊叹号、点号,或者是问号。

译注2:台湾翻译为“字符集”,但通常“字符集”指的是character set,为避免混淆,此处翻译为“字符组”。

16

第1章:正则表达式入门请注意,只有在字符组内部,连字符才是元字符——否则它就只能匹配普通的连字符号。其实,即使在字符组内部,它也不一定就是元字符。如果连字符出现在字符组的开头,它表示的就只是一个普通字符,而不是一个范围。同样的道理,问号和点号通常被当作元字符处理,但在字符组中则不是如此(说明白一点就是,「[0-9A-Z_!.?]」里面,真正的特殊字符就只有那两个连字符)。

Egrep元字符17

分析「^cat$」、「^$」和「^」

第8页问题的答案

「^cat$」文字意义:匹配的条件是,行开头(显然,每一行都有开头),然后是字母

c a t,然后是行末尾。

应用意义:只包含cat的行——没有多余的单词、空白字符……只有‘cat’。

「^$」文字意义:匹配的条件是,行开头,然后就是行末尾。

应用意义:空行(没有任何字符,包括空白字符)。

「^」文字意义:匹配条件是行的开头。

应用意义:无意义!因为每一行都有开头,所以每一行都能匹配——空行也

不例外。

不妨把字符组看作独立的微型语言。在字符组内部和外部,关于元字符的规定(哪

些是元字符,以及它们的意义)是不同的。

我们很快就会看到更多的例子。

排除型字符组

用「[^…]」取代「[…]」,这个字符组就会匹配任何未列出的字符。例如,「[^1-6]」匹配除了1到6以外的任何字符。这个字符组中开头的「^」表示“排除(negate)”,所以这里列出的不是希望匹配的字符,而是不希望匹配的字符。

读者可能注意到了,这里的^和第8页的表示行首的脱字符是一样的。字符确实相同,但意义截然不同。英语里的“wind”,根据情境的不同,可能表示一阵强烈的气流(风),也可能表示给钟表上发条;元字符也是如此。我们已经看过用来表示范围的连字符的例子。只有在

18

第1章:正则表达式入门字符组内部(而且不是第一个字符的情况下),连字符才能表示范围。在字符组外部,^表示一个行锚点(line anchor),但是在字符组内部(而且必须是紧接在字符组的第一个方括号之后),它就是一个元字符。请不要担心——这就是最复杂的情况,接下来的内容比这简单。

Egrep元字符19 来看另一个例子,我们需要在一堆英文单词中搜索出一些特殊的单词:在这些单词中,字母q后面的字母不是u。用正则表达式来表示,就是「q[^u]」。用这个正则表达式来搜索我手头的数据,确实得到了一些结果,但显然不多,其中还有些是我没见过的英文单词。

下面是结果(我输入的命令用粗体表示):

% egrep 'q[^u]' word.list

Iraqi

Iraqian

miqra

qasida

qintar

qoph

zaqqum%

其中有两个单词值得注意:伊拉克“Iraq”和澳大利亚航空公司的名字“Qantas”。尽管它们都在word.list文件中,但都不包含在egrep结果中。为什么呢? 请动动脑筋,然后翻到下一页来检查你的答案。

请记住,排除型字符组表示“匹配一个未列出的字符(match a character that's not listed)”,而不是“不要匹配列出的字符(don't match what is listed)”。这两种说法看起来一样,但是Iraq 的例子说明了其中的细微差异。有一种简单的理解排除型字符组的办法,就是把它们看作普通的字符组,里面包含的是除了“排除型字符组中所有字符”以外的字符。

用点号匹配任意字符

Matching Any Character with Dot

20

第1章:正则表达式入门元字符「.」(通常称为点号dot或者小点point)是用来匹配任意字符的字符组的简便写法。如果我们需要在表达式中使用一个“匹配任何字符”的占位符(placeholder),用点号就很方便。例如,如果我们需要搜索03/19/76、03-19-76或者03.19.76,不怕麻烦的话用一个明确容许‘/’、‘-’、‘.’的字符组来构建正则表达式,例如「03[-./]19[-./]76」。也可以简单地尝试「03.19.76」。

读者第一次接触这个表达式时,可能还不清楚某些情况。在「03[-./]19[-./]76」中,点号并不是元字符,因为它们在字符组内部(记住,在字符组里面和外面,元字符的定义和意义是不一样的)。这里的连字符同样也不是元字符,因为它们都紧接在[ 或者[^ 之后。如果连字符不在字符组的开头,例如「[.-/]」,就是用来表示范围的,在本例中就是错误的用法。

ragel学习

Ragel学习笔记 解决的问题 采用一个连续的可能庞大的正则表达式,可以有一些分块式action,或者只是判断某一串符合此表达式。采用解决问题模型为有限状态机。 语法 嵌入C, C++, Objective-C, D, Go,Java and Ruby. 多行代码 %%{ … … }%% 单行代码%% 实例代码 #include #include %%{ machine foo; main := ( 'foo' | 'bar' ) 0 @{ res = 1; }; }%% %% write data; int main( int argc, char **argv ) { int cs, res = 0; if ( argc > 1 ) { char *p = argv[1]; char *pe = p + strlen(p) + 1; %% write init; %% write exec; } printf("result = %i\n", res ); return 0; }

状态机名 machine fsm_name; 必须在块开头注明,如上例。如果没注明则用先前使用的,如没有则报错。可以采用多文件编译include为关键字导入文件。 定义语句 = ; 名为name的state直到定义实例化(被引用时(下一个为:=形式))才生成,该语句类似一个类的定义 状态机实例化 := ; 该语句产生状态机的一个状态,名为main的状态为初始start状态。 %% write init // 该命令设置cs (current_state) 为main的状态,即为start状态 如果没有main 则最近一个实例化的状态即为开始状态。 在外部执行控制语句可以通过设置cs来设置状态机,内部执行,采用fcall fgoto fnext实现状态切换。 导入ragel代码 include FsmName "inputfile.rl"; 如果没名会与当前状态机同名,如果没输入文件,则导入FsmName,检索路径与当前文件相同,可以通过-I命令增加include 检索路径,同makefile。 导入定义 import "inputfile.h"; 文件内容形如:(单引号类似命令标记)定义name 为number(纯数字) 或者lit_string(字符串) name '=' number name '=' lit_string 'define' name number 'define' name lit_string 如果输入文件为一个ragel 程序则忽略所有tokens,检索路径与当前文件相同,可以通过-I 命令增加import检索路径,同include。

正则表达式 Regular Expression 例子 sample VB版

VS SDK Regular Expression Language Service Example Deep Dive (VB) István Novák (DiveDeeper), Grepton Ltd. May, 2008 Introduction This example implements a small language service for demonstration purposes. This is called Regular Expression Language Service since it can tokenize text by RegEx patterns (lower case letters, capital letters, digits) and can use its own syntax coloring scheme for each token. However, the functionality of this sample is quite far away from a full language service it illustrates the basics. The source files belonging to this code have only about three hundred lines of essential code. When reading through this deep dive you are going to get familiar with the following concepts: How language services should be registered with Visual Studio? What kind of lifecycle management tasks a simple language service has? How to create a very simple language service? How to implement a scanner supporting syntax coloring? To understand concepts treated here it is assumed that you are familiar with the idea of VSPackages and you know how to build and register very simple (even non-functional) packages. To get more information about packages, please have a look at the Package Reference Sample (VisualBasic Reference.Package sample). Very basic knowledge about regular expressions is also expected. Regular Expression Language Service Open the Microsoft Visual Studio 2008 SDK Browser and select the Samples tab. In the top middle list you can search for the “VisualBasic Example.RegExLangServ” sample. Please, use the “Open this sample in Visual Studio” link at the top right panel of the browser app to prepare the sample. The application opens in Visual Studio 2008. Running the sample Rebuild the package and start it with the Experimental Hive! Without creating a new solution, add a new text file with the File|New|File... menu function. Use the File|Save As menu function to store the text file with the RegexFile.rgx name. To avoid attaching the .txt extension to the end of the file name, set the “Save as type” to “All files (*.*)” as illustrated in Figure 1:

正则表达式常用发发总结

//判断输入内容是否为空 function IsNull(){ var str = document.getElementById('str').value.trim(); if(str.length==0){ alert('对不起,文本框不能为空或者为空格!'); //请将“文本框”改成你需要验证的属性名称! } } //判断日期类型是否为YYYY-MM-DD格式的类型 function IsDate(){ var str = document.getElementById('str').value.trim(); if(str.length!=0){ var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/; var r = str.match(reg); if(r==null) alert('对不起,您输入的日期格式不正确!'); //请将“日期”改成你需要验证的属性名称! } } //判断日期类型是否为YYYY-MM-DD hh:mm:ss格式的类型 function IsDateTime(){ var str = document.getElementById('str').value.trim();

if(str.length!=0){ var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}): (\d{1,2}):(\d{1,2})$/; var r = str.match(reg); if(r==null) alert('对不起,您输入的日期格式不正确!'); //请将“日期”改成你需要验证的属性名称! } } //判断日期类型是否为hh:mm:ss格式的类型 function IsTime() { var str = document.getElementById('str').value.trim(); if(str.length!=0){ reg=/^((20|21|22|23|[0-1]\d)\:[0-5][0-9])(\:[0-5][0-9])?$/ if(!reg.test(str)){ alert("对不起,您输入的日期格式不正确!"); //请将“日期”改成你需要验证的属性名称! } } } //判断输入的字符是否为英文字母

正则表达式经典手册

引言 正则表达式(regular expression)就是用一个“表达式”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如表达式“ab+” 描述的特征是“一个 'a' 和任意个'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征。 正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。(3)用来替换,比普通的替换更强大。 正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。 文章中的每一个举例,都可以点击进入到测试页面进行测试。闲话少说,开始。 1. 正则表达式规则 1.1 普通字符 字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。 举例1:表达式 "c",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"c";匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同) 举例2:表达式 "bcd",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"bcd";匹配到的位置是:开始于1,结束于4。 1.2 简单的转义字符 一些不便书写的字符,采用在前面加 "\" 的方法。这些字符其实我们都已经熟知了。

正则表达式教程

正则表达式 学习要点: 1.什么是正则表达式 2.创建正则表达式 3.获取控制 4.常用的正则 假设用户需要在HTML 表单中填写姓名、地址、出生日期等。那么在将表单提交到服 务器进一步处理前,JavaScript 程序会检查表单以确认用户确实输入了信息并且这些信息是 符合要求的。 一.什么是正则表达式 正则表达式(regular expression)是一个描述字符模式的对象。ECMAScript 的RegExp 类 表示正则表达式,而String 和RegExp 都定义了使用正则表达式进行强大的模式匹配和文本 检索与替换的函数。 正则表达式主要用来验证客户端的输入数据。用户填写完表单单击按钮之后,表单就会 被发送到服务器,在服务器端通常会用PHP、https://www.doczj.com/doc/258027591.html, 等服务器脚本对其进行进一步处理。 因为客户端验证,可以节约大量的服务器端的系统资源,并且提供更

好的用户体验。 二.创建正则表达式 创建正则表达式和创建字符串类似,创建正则表达式提供了两种方法,一种是采用new 运算符,另一个是采用字面量方式。 1.两种创建方式 var box = new RegExp('box'); //第一个参数字符串 var box = new RegExp('box', 'ig'); //第二个参数可选模式修饰符 模式修饰符的可选参数 参数含义 i 忽略大小写 g 全局匹配 m 多行匹配 var box = /box/; //直接用两个反斜杠 var box = /box/ig; //在第二个斜杠后面加上模式修饰符 2.测试正则表达式 RegExp 对象包含两个方法:test()和exec(),功能基本相似,用于测试字符串匹配。test() 方法在字符串中查找是否存在指定的正则表达式并返回布尔值,如果存在则返回true,不存 在则返回false。exec()方法也用于在字符串中查找指定正则表达式,如果exec()方法执行成

《易语言“正则表达式”详细教程》

《易语言“正则表达式”教程》 本文改编自多个文档,因此如有雷同,不是巧合。 “正则表达式”的应用范围越来越广,有了这个强大的工具,我们可以做很多事情,如搜索一句话中某个特定的数据,屏蔽掉一些非法贴子的发言,网页中匹配特定数据,代码编辑框中字符的高亮等等,这都可以用正则表达式来完成。 本书分为四个部分。 第一部分介绍了易语言的正则表达式支持库,在这里,大家可以了解第一个正则表达式的易语言程序写法,以及一个通用的小工具的制作。 第二部分介绍了正则表达式的基本语法,大家可以用上述的小工具进行试验。 第三部分介绍了用易语言写的正则表达式工具的使用方法。这些工具是由易语言用户提供的,有的工具还带有易语言源码。他们是:monkeycz、零点飞越、寻梦。 第四部分介绍了正则表达式的高级技巧。 目录 《易语言“正则表达式”教程》 (1) 目录 (1) 第一章易语言正则表达式入门 (3) 一.与DOS下的通配符类似 (3) 二.初步了解正则表达式的规定 (3) 三.一个速查列表 (4) 四.正则表达式支持库的命令 (5) 4.1第1个正则表达式程序 (5) 4.2第2个正则表达式例程 (7) 4.3第3个例程 (8) 4.4一个小型的正则工具 (9) 第二章揭开正则表达式的神秘面纱 (11) 引言 (12) 一.正则表达式规则 (12) 1.1普通字符 (12) 1.2简单的转义字符 (13) 1.3能够与“多种字符”匹配的表达式 (14) 1.4自定义能够匹配“多种字符”的表达式 (16) 1.5修饰匹配次数的特殊符号 (17) 1.6其他一些代表抽象意义的特殊符号 (20) 二.正则表达式中的一些高级规则 (21) 2.1匹配次数中的贪婪与非贪婪 (21)

编写正则表达式的常用符号

正则表达式中常用符号 符号含义举例或说明 .任何字符或非字符 2.4匹配204, 214, 2t4, 2 4, 2.4, 2-4 *重复0次或更多BA*匹配B,BA,BAA,BAAA等 .* 某个字符重复0次或更多R.* 表示R后面有0个过多个字符,不同类副词 的赋码包括RR,RG,PGQ,RGQV等, 所以R.*表示, 不分类笼统地指所有副词, 类似的所有名词 N.*,所有形容词J.* +重复1次或多次A+匹配A,AA,AAA等 ?有或者无BA?匹配B和BA .*?任何字符串 |或者(|号在回车键上面)(analyze|analyse) 检索analyse 或者 analyze [ ] 方括号中的任意字符或单词[abc]匹配a、b或c [abc]+匹配 [ ]* n个单词。 () 组合,使得括号中的部分可以当作 一个符号处理 act(ing)可以匹配act和acting (cat|dog),把dog 和cat 两个词一块检索出来, ([pos="R.*"][pos="J.*"]) 前面一个词的词性为副词, 后面一个词的词性为形容词,把副词和形容词作 为一个整体检索 {} { }表示选择范围,{0,3}表示0~3个 范围内[pos="J.*"]{0,2} 表示其前的形容词有0个,1个或者2个 [ ] {0,}中,[ ]表示任意单词,{0,2}表示这个单词有0个,1个,或者无穷个,后面一个数字不写表示无穷个。 & 和,并且

段首标记, “however|However”表示句首为However或 however 开头的句子 !不等于[word!=","] "which"表示which 前没有逗号 [pos!="JJ.*|N.*|I.*"] 词性不是形容词、名词、介词 的词 N.*名词、V.* 动词、J.*形容词、R.* 副词、AT.* 冠词、I.* 介词、P.*代词 VB.*表示be动词、VH*有动词、VV.*实意动词及其各种变形、VM*情态动词

正则表达式 (1)

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 列目录时,dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。 正则表达式是由普通字符(例如字符a 到z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 3.1 普通字符 由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。 3.2 非打印字符 字符含义 \cx 匹配由x指明的控制字符。例如,\cM 匹配一个Control-M 或回车符。x 的值必须为A-Z 或a-z 之一。否则,将c 视为一个原义的‘c’ 字符。 \f 匹配一个换页符。等价于\x0c 和\cL。 \n 匹配一个换行符。等价于\x0a 和\cJ。 \r 匹配一个回车符。等价于\x0d 和\cM。 \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。\S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。 \t 匹配一个制表符。等价于\x09 和\cI。 \v 匹配一个垂直制表符。等价于\x0b 和\cK。

3.5 定位符 用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。 3.6 选择 用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。 其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。 3.7 后向引用 对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从1 开始,连续编号直至最大99 个子表达式。每个缓冲区都可以使用‘\n’ 访问,其中n 为一个标识特定缓冲区的一位或两位十进制数。 可以使用非捕获元字符‘?:’, ‘?=’, or ‘?!’ 来忽略对相关匹配的保存。 4. 各种操作符的运算优先级 相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下: 操作符描述 \ 转义符 (), (?:), (?=), [] 圆括号和方括号 *, +, ?, {n}, {n,}, {n,m} 限定符 ^, $, \anymetacharacter 位置和顺序 | “或”操作 5. 全部符号解释

RegexBuddy工具的使用教程

RegexBuddy工具的使用教程(图文)1 2009-10-14 12:14 一、什么是RegexBuddy 使用了几天,个人感觉RegexBuddy 是学习正则表达式时的比较好的帮手。它可以容易地建立你想要的正确的正则表达式。清晰地推断他人所写的复杂的正则表达式。它还可以用给出的实例字符串或文件快速地进行测试匹配,从而防止了在实际应用中出现错误。RegexBuddy会在你的源代码中根据你所应用的特殊编程语言,自动生成带有正则表达式的代码段。同时你也可以收集正则表达式到库中,以在未来重新使用。 二、获得RegexBuddy 目前最新的版本是3.2.1(图2-1),于2008年12月9日发布的。可以在https://www.doczj.com/doc/258027591.html,/(RegexBuddy的官网)进行最新版本的下载和正版的购买。 图2-1 RegexBuddy的3.2.1版 三、初步认识RegexBuddy 安装比较简单(略过) 首先,我们先对RegexBuddyg 产生一个整体的初步的认识,而不是设法解释所有的东西。RegexBuddyg是相当易懂的容易的,所以我想经过简单大家应该能够基本正确地使用它。

默认情况下,RegexBuddy会在顶部显示正则表达式和上一次使用的历史,如图 2-1。 图3-1 RegexBuddy的顶部 底部会显示7个选项卡,分别是“Create”、“Test”、“Debug”、“Use”、“Library”、“GREP”、“Forum”(需要注册才能使用此功能),如图2-2。 图3-2 RegexBuddy的底部 如果你的显示器较大,也可以分成两块平铺,你可以单击窗口最右上方工具栏上的“View”按键,在菜单中选择“Side by Side Layout”,这样你可以最大限度的同时查看两个窗口(图3-4)。

JS正则表达式大全

JS正则表达式大全 JS正则表达式大全【1】 正则表达式中的特殊字符【留着以后查用】字符含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/将只匹配"a*"。 ^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a" $ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A" * 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa + 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa ? 匹配前面元字符0次或1次,/ba*/将匹配b,ba (x) 匹配x保存x在名为$1...$9的变量中 x|y 匹配x或y {n} 精确匹配n次 {n,} 匹配n次以上 {n,m} 匹配n-m次 [xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符) [^xyz] 不匹配这个集合中的任何一个字符 [\b] 匹配一个退格符 \b 匹配一个单词的边界 \B 匹配一个单词的非边界 \cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M \d 匹配一个字数字符,/\d/ = /[0-9]/ \D 匹配一个非字数字符,/\D/ = /[^0-9]/ \n 匹配一个换行符 \r 匹配一个回车符 \s 匹配一个空白字符,包括\n,\r,\f,\t,\v等 \S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/ \t 匹配一个制表符 \v 匹配一个重直制表符 \w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配

常用正则表达式

1. 平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: 2. "^\d+$"//非负整数(正整数+ 0) 3. "^[0-9]*[1-9][0-9]*$"//正整数 4. "^((-\d+)|(0+))$"//非正整数(负整数+ 0) 5. "^-[0-9]*[1-9][0-9]*$"//负整数 6. "^-?\d+$"//整数 7. "^\d+(\.\d+)?$"//非负浮点数(正浮点数+ 0) 8. "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"//正浮点数 9. "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"//非正浮点数(负浮点数+ 0) 10. "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"//负浮点数 11. "^(-?\d+)(\.\d+)?$"//浮点数 12. "^[A-Za-z]+$"//由26个英文字母组成的字符串 13. "^[A-Z]+$"//由26个英文字母的大写组成的字符串 14. "^[a-z]+$"//由26个英文字母的小写组成的字符串 15. "^[A-Za-z0-9]+$"//由数字和26个英文字母组成的字符串 16. "^\w+$"//由数字、26个英文字母或者下划线组成的字符串 17. "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"//email地址 18. "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"//url 19. /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日 20. /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年 21. "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil 22. /^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/ //电话号码 23. "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}| 1dd|2[0-4]d|25[0-5])$" //IP地址 24. 25. 匹配中文字符的正则表达式:[\u4e00-\u9fa5] 26. 匹配双字节字符(包括汉字在内):[^\x00-\xff] 27. 匹配空行的正则表达式:\n[\s| ]*\r 28. 匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 29. 匹配首尾空格的正则表达式:(^\s*)|(\s*$) 30. 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 31. 匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 32. 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 33. 匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 34. 匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 35. 36. 37. 元字符及其在正则表达式上下文中的行为:

正则表达式教程

正则表达式教程 早期起源 正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloc h 和Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。 1956 年, 一位叫Stephen Kleene 的数学家在McCulloch 和Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。 随后,发现可以将这一工作应用于使用Ken Thompson 的计算搜索算法的一些早期研究,K en Thompson 是Unix 的主要发明人。正则表达式的第一个实用应用程序就是Unix 中的qed 编辑器。 如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。 正则表达式 如果原来没有使用过正则表达式,那么可能对这个术语和概念会不太熟悉。不过,它们并不是您想象的那么新奇。 请回想一下在硬盘上是如何查找文件的。您肯定会使用? 和* 字符来帮助查找您正寻找的文件。? 字符匹配文件名中的单个字符,而* 则匹配一个或多个字符。一个如'data?.dat' 的模式可以找到下述文件: data1.dat data2.dat datax.dat dataN.dat 如果使用* 字符代替? 字符,则将扩大找到的文件数量。'data*.dat' 可以匹配下述所有文件名: data.dat data1.dat data2.dat data12.dat datax.dat dataXYZ.dat 尽管这种搜索文件的方法肯定很有用,但也十分有限。? 和* 通配符的有限能

[VIP专享]经典正则表达式QRegExp的解析

QRegExp正则表达式 2010-03-20 17:00 "^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\d+)|(0+))$" //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$" //负整数 "^-?\d+$" //整数 "^\d+(\.\d+)?$" //非负浮点数(正浮点数 + 0) "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数 "^((-\d+(\.\d+)?)|(0+(\.0+)?))$" //非正浮点数(负浮点数 + 0) "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0- 9]*[1-9][0-9]*)))$" //负浮点数 "^(-?\d+)(\.\d+)?$" //浮点数 "^[A-Za-z]+$" //由26个英文字母组成的字符串 "^[A-Z]+$" //由26个英文字母的大写组成的字符串 "^[a-z]+$" //由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串 "^\w+$" //由数字、26个英文字母或者下划线组成的字符串 "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$" //email地址 "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$" //url "^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$" // 年-月-日 "^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$" // 月/日/年 "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Email "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //电话号码 "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0- 5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址 ^([0-9A-F]{2})(-[0-9A-F]{2}){5}$ //MAC地址的正则表达式 ^[-+]?\d+(\.\d+)?$ //值类型正则表达式 QRegExp是Qt的正则表达式类. Qt中有两个不同类的正则表达式. 第一类为元字符.它表示一个或多个常量表达式. 令一类为转义字符,它代表一个特殊字符. 一.元字符 . 匹配任意单个字符.例如, 1.3 可能是1. 后面跟任意字符,再跟3

GAE入门教程

GAE入门教程 1.简介 介绍什么是Google App Engine 2.开发环境 如何下载并安装SDK包,如何配置调试环境 3.Hello World 开始编写Hello world程序,帮助你初步了解Google App Engine程序的编写 4.使用webapp framework 学习使用Web框架来编写Web应用 5.用户系统服务 学习如何判断Google用户登录,获取Goolge登录后的用户信息 6.处理表单数据 处理Form表单,学习Post和Get用法 7.数据存储 学习Google 数据模型以及查询语法GQL 8.使用模版文件 学习使用模板文件来显示网页,让数据和页面分离,加快网站开发速度 9.使用静态文件 学习如何处理CSS,JS,图片等静态文件 10.上传应用程序 发布你已经完成的Web应用到Google服务器上

Google App Engine入门:简介 (本文译自:Google App Engine Getting Started) 欢迎使用Google App Engine! 创建一个Google App Engine应用非常简便,只需要花费你几分钟时间. 你可以很方便的创建你的网站应用:直接上传并分享,不需要进行任何的修改和注释。 在这个指导里,我们将创建一个简单的留言本,让用户可以发表留言。并且支持匿名和Google帐号两种方式发表留言。 这个留言本程序将演示如何使用Google的数据存储,集成Google账户系统,如何使用一个简单的Python Web framework来调试GAE网站。并且还将演示如何使用Django的模版引擎。 接下来... 为了开始编写你的Google App Engine应用程序,你必须先下载Google App Engine软件开发环境。 下一章:Google App Engine软件开发环境.

语法词法生成器

语法词法生成器 一、语法词法生成器Flex 语法扫描器生成器 flex (fast lexical analyser generator) 是Lex的另一个替代品。它经常和自由软件Bison语法分析器生成器一起使用。Flex 最初由Vern Paxson 于1987 年用C语言写成。语法分析生成器JavaCC JavaCC(Java Compiler Compiler) 是一个用JA V A开发的最受欢迎的语法分析生成器。这个分析生成器工具可以读取上下文无关且有着特殊意义的语法并把它转换成可以识别且匹 配该语法的JA VA程序。它还提供JJTree等工具来...语法分析器生成工具YACC 这是一个经典的生成语法分析器的工具,大学的《编译原理》课程里介绍过。词法分析工具ANTLR ANTLR(ANother Tool for Language Recognition)它是Java开发的词法分析工具,它可以接受词文法语言描述,并能产生识别这些语言的语句的程序。作为翻译程序的一部分,你可以使用简单的操作符和动作来参数化你的文法...解析器生成器

Bison GNU bison是一个自由软件,用于自动生成语法分析器程序,实际上可用于所有常见的操作系统。Bison把LALR形式的上下文无关文法描述转换为可做语法分析的C或C++程序。在新近版本中,Bison增加了对GLR语法分析算法的支...词法分析器生成工具Lex 这是一个经典的生成词法分析器的工具语法分析器生成工 具Berkeley Yacc Berkeley Yacc (byacc) 是一个高质量的yacc 变种,其目的是为了避免依赖某个特定的编译器。语法分析生成器JFlex JFlex是一个Java的词法/语法分析生成器。JavaScript解析器Jison JavaScript解析器,Coffee就是使用Jison解析的。Jison 将一个上下文无关语法作为输入,输出对应的JavaScript代码,类似Yacc。词法/语法分析框架chrysanthemum chrysanthemum (中文名“菊花”)是一个由C++写成的小巧

正则表达式介绍和例子分析

含义:编写字符串处理的程序或网页时,会有查找符合某复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。它是记录文本规则的代码。 元字符 用来代替字符的符号 表1.常用的元字符 代码说明 .匹配除换行符以外的任意字符 \w匹配字母或数字或下划线或汉字 \s匹配任意的空白符 \d匹配数字 注:\s匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等正则表达式中的空格会当成空格匹配。(输入几个空格就匹配几个) 非打印字符

限定符 重复:表现重复时用的是大括号{}和* + ,表示范围时用的是中括号[],中括号里面是只选其中一个的组合。表达分组时用圆括号(),一个圆括号表示一个意思。 表2.常用的限定符 代码/语法说明 *重复零次或更多次 +重复一次或更多次 重复零次或一次 {n}重复n次 {n,}重复n次或更多次 {n,m}重复n到m次 字符类[],用来表示取字符的范围区间,用中括号括起来 [0-9]代表\d [a-z0-9A-Z]表示\w 分支条件,用|表示或者的关系。 贪婪与懒惰、最先开始匹配拥有最高优先权 *、+和限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个就可以实现非贪婪或最小匹配。 .*表示尽可能匹配多的字符 .*表示尽可能少的字符 例如:字符串aabab,用贪婪匹配a.*b得到aabab,用懒惰匹配a.*b得到aab和ab

定位符 定位符使您能够将正则表达式固定到行首或行尾。它们还使您能够创建这样的正则表达式,这些正则表达 式出现在一个单词内、在一个单词的开头或者一个单词的结尾。 定位符用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表 示非单词边界。 正则表达式的限定符有: 字符描述 ^匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后匹配。 $匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与 \n 或 \r 之前匹配。 \b匹配一个字边界,即字与空格间的位置。 \B非字边界匹配。 子表达式分组获取() 分组,用()把子表达式括起来,给一个组号,后面可以再用 后向引用,用()定义的分组,可以给它定一个组名,在后面加以利用。 用(\w+)或者(’Word’\w+)定义\w+组名为Word,利用方式为\k

正则表达式经典教程

正则表达式是常见常忘,所以还是记下来比较保险,于是就有了这篇笔记。 希望对大家会有所帮助。J 1.什么是正则表达式 简单的说,正则表达式是一种可以用于文字模式匹配和替换的强有力的工具。是由一系列普通字符和特殊字符组成的能明确描述文本字符串的文字匹配模式。 正则表达式并非一门专用语言,但也可以看作是一种语言,它可以让用户通过使用一系列普通字符和特殊字符构建能明确描述文本字符串的匹配模式。除了简单描述这些模式之外,正则表达式解释引擎通常可用于遍历匹配,并使用模式作为分隔符来将字符串解析为子字符串,或以智能方式替换文本或重新设置文本格式。正则表达式为解决与文本处理有关的许多常见任务提供了有效而简捷的方式。 正则表达式具有两种标准: ·基本的正则表达式(BRE – Basic Regular Expressions) ·扩展的正则表达式(ERE – Extended Regular Expressions)。 ERE包括BRE功能和另外其它的概念。 正则表达式目前有两种解释引擎: ·基于字符驱动(text-directed engine) ·基于正则表达式驱动(regex-directed engine) Jeffery Friedl把它们称作DFA和NFA解释引擎。 约定: 为了描述起来方便,在本文中做一些约定: 1. 本文所举例的所有表达时都是基于NFA解释引擎的。 2. 正则表达式,也就是匹配模式,会简写为Regex。 3. Regex的匹配目标,也就是目标字符串,会简写为String。 4. 匹配结果用会用黄色底色标识。 5. 用1\+1=2 括起来的表示这是一个regex。 6. 举例会用以下格式: Regex Target String Description test This is a test 会匹配test,testcase等 2.正则表达式的起源正则表达式的?祖先?可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。 1956 年, 一位叫 Stephen Kleene 的美国数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为?神经网事件的表示法?的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为?正则集的代数?的表达式,因此采用?正则表达式?这个术语。

相关主题