深入浅出之正则表达式(二)

深入浅出之正则表达式(二)
深入浅出之正则表达式(二)

前言

半年前我对正则表达式产生了兴趣,在网上查找过不少资料,看过不少的教程,最后在使用一个正则表达式工具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”。

特殊字符

对于文字字符,有11个字符被保留作特殊用途。他们是:

[ ] \ ^ $ . | ? * + ( )

这些特殊字符也被称作元字符。

如果你想在正则表达式中将这些字符用作文本字符,你需要用反斜杠“\”对其进行换码(escape)。例如你想匹配“1+1=2”,正确的表达式为<<1\+1=2>>.

需要注意的是,<<1+1=2>>也是有效的正则表达式。但它不会匹配“1+1=2”,而会匹配“123+111=234”中的“111=2”。因为“+”在这里表示特殊含义(重复1次到多次)。

在编程语言中,要注意,一些特殊的字符会先被编译器处理,然后再传递给正则引擎。因此正则表达式<<1\+2=2>>在C++中要写成“1\\+1=2”。为了匹配“C:\temp”,你要用正则表达式<>。而在C++中,正则表达式则变成了“C:\\\\temp”。

?不可显示字符

可以使用特殊字符序列来代表某些不可显示字符:

<<\t>>代表Tab(0x09)

<<\r>>代表回车符(0x0D)

<<\n>>代表换行符(0x0A)

要注意的是Windows中文本文件使用“\r\n”来结束一行而Unix使用“\n”。

4. 正则表达式引擎的内部工作机制

知道正则表达式引擎是如何工作的有助于你很快理解为何某个正则表达式不像你期望的那样工作。

有两种类型的引擎:文本导向(text-directed)的引擎和正则导向(regex-directed)的引擎。Jeffrey Friedl把他们称作DFA和NFA引擎。本文谈到的是正则导向的引擎。这是因为一些非常有用的特性,如“惰性”量词(lazy quantifiers)和反向引用(backreferences),只能在正则导向的引擎中实现。所以毫不意外这种引擎是目前最流行的引擎。

你可以轻易分辨出所使用的引擎是文本导向还是正则导向。如果反向引用或“惰性”量词被实现,则可以肯定你使用的引擎是正则导向的。你可以作如下测试:将正则表达式

<>应用到字符串“regex not”。如果匹配的结果是regex,则引擎是正则导向的。如果结果是regex not,则是文本导向的。因为正则导向的引擎是“猴急”的,它会很急切的进行表功,报告它找到的第一个匹配。

?正则导向的引擎总是返回最左边的匹配

这是需要你理解的很重要的一点:即使以后有可能发现一个“更好”的匹配,正则导向的引擎也总是返回最左边的匹配。

当把<>应用到“He captured a catfish for his cat”,引擎先比较<>和“H”,结果失败了。于是引擎再比较<>和“e”,也失败了。直到第四个字符,<>匹配了“c”。<>匹配了第五个字符。到第六个字符<>没能匹配“p”,也失败了。引擎再继续从第五个字符重新检查匹配性。直到第十五个字符开始,<>匹配上了“catfish”中的“cat”,正则表达式引擎急切的返回第一个匹配的结果,而不会再继续查找是否有其他更好的匹配。

5. 字符集

字符集是由一对方括号“[]”括起来的字符集合。使用字符集,你可以告诉正则表达式引擎仅仅匹配多个字符中的一个。如果你想匹配一个“a”或一个“e”,使用<<[ae]>>。你可以使用<>匹配gray或grey。这在你不确定你要搜索的字符是采用美国英语还是英国英语时特别有用。相反,<>将不会匹配graay或graey。字符集中的字符顺序并没有什么关系,结果都是相同的。

你可以使用连字符“-”定义一个字符范围作为字符集。<<[0-9]>>匹配0到9之间的单个数字。你可以使用不止一个范围。<<[0-9a-fA-F] >>匹配单个的十六进制数字,并且大小写不敏感。你也可以结合范围定义与单个字符定义。<<[0-9a-fxA-FX]>>匹配一个十六进制数字或字母X。再次强调一下,字符和范围定义的先后顺序对结果没有影响。

?字符集的一些应用

查找一个可能有拼写错误的单词,比如<> 或

<>。

查找程序语言的标识符,<>。(*表示重复0或多次) 查找C风格的十六进制数<<0[xX][A-Fa-f0-9]+>>。(+表示重复一次或多次) ?取反字符集

在左方括号“[”后面紧跟一个尖括号“^”,将会对字符集取反。结果是字符集将匹配任何不在方括号中的字符。不像“.”,取反字符集是可以匹配回车换行符的。

需要记住的很重要的一点是,取反字符集必须要匹配一个字符。<>并不意味着:匹配一个q,后面没有u跟着。它意味着:匹配一个q,后面跟着一个不是u的字符。所以它不会匹配“Iraq”中的q,而会匹配“Iraq is a country”中的q和一个空格符。事实上,空格符是匹配中的一部分,因为它是一个“不是u的字符”。

如果你只想匹配一个q,条件是q后面有一个不是u的字符,我们可以用后面将讲到的向前查看来解决。

?字符集中的元字符

需要注意的是,在字符集中只有4个字符具有特殊含义。它们是:“] \ ^ -”。“]”代表字符集定义的结束;“\”代表转义;“^”代表取反;“-”代表范围定义。其他常见的元字符在字符集定义内部都是正常字符,不需要转义。例如,要搜索星号*或加号+,你可以用

<<[+*]>>。当然,如果你对那些通常的元字符进行转义,你的正则表达式一样会工作得很好,但是这会降低可读性。

在字符集定义中为了将反斜杠“\”作为一个文字字符而非特殊含义的字符,你需要用另一个反斜杠对它进行转义。<<[\\x]>>将会匹配一个反斜杠和一个X。“]^-”都可以用反斜杠进行转义,或者将他们放在一个不可能使用到他们特殊含义的位置。我们推荐后者,因为这样可以增加可读性。比如对于字符“^”,将它放在除了左括号“[”后面的位置,使用的都是文字字符含义而非取反含义。如<<[x^]>>会匹配一个x或^。<<[]x]>>会匹配一个“]”或“x”。<<[-x]>>或<<[x-]>>都会匹配一个“-”或“x”。

?字符集的简写

因为一些字符集非常常用,所以有一些简写方式。

<<\d>>代表<<[0-9]>>。

<<\w>>代表单词字符。这个是随正则表达式实现的不同而有些差异。绝大多数的正则表达式实现的单词字符集都包含了<>。

<<\s>>代表“白字符”。这个也是和不同的实现有关的。在绝大多数的实现中,都包含了空格符和Tab符,以及回车换行符<<\r\n>>。

字符集的缩写形式可以用在方括号之内或之外。<<\s\d>>匹配一个白字符后面紧跟一个数字。<<[\s\d]>>匹配单个白字符或数字。<<[\da-fA-F]>>将匹配一个十六进制数字。

取反字符集的简写:

<<[\S]>> = <<[^\s]>>

<<[\W]>> = <<[^\w]>>

<<[\D]>> = <<[^\d]>>

?字符集的重复

如果你用“?*+”操作符来重复一个字符集,你将会重复整个字符集。而不仅是它匹配的那个字符。正则表达式<<[0-9]+>>会匹配837以及222。

如果你仅仅想重复被匹配的那个字符,可以用向后引用达到目的。我们以后将讲到向后引用。

6. 使用?*或+进行重复

?:告诉引擎匹配前导字符0次或一次。事实上是表示前导字符是可选的。

+:告诉引擎匹配前导字符1次或多次

*:告诉引擎匹配前导字符0次或多次

<[A-Za-z][A-Za-z0-9]*>匹配没有属性的HTML标签,“<”以及“>”是文字符号。第一个字符集匹配一个字母,第二个字符集匹配一个字母或数字。

我们似乎也可以用<[A-Za-z0-9]+>。但是它会匹配<1>。但是这个正则表达式在你知道你要搜索的字符串不包含类似的无效标签时还是足够有效的。

?限制性重复

许多现代的正则表达式实现,都允许你定义对一个字符重复多少次。词法是:{min,max}。min和max都是非负整数。如果逗号有而max被忽略了,则max没有限制。如果逗号和max都被忽略了,则重复min次。

因此{0,}和*一样,{1,}和+的作用一样。

你可以用<<\b[1-9][0-9]{3}\b>>匹配1000~9999之间的数字(“\b”表示单词边界)。<<\b[1-9][0-9]{2,4}\b>>匹配一个在100~99999之间的数字。

?注意贪婪性

假设你想用一个正则表达式匹配一个HTML标签。你知道输入将会是一个有效的HTML 文件,因此正则表达式不需要排除那些无效的标签。所以如果是在两个尖括号之间的内容,就应该是一个HTML标签。

许多正则表达式的新手会首先想到用正则表达式<< <.+> >>,他们会很惊讶的发现,对于测试字符串,“This is a first test”,你可能期望会返回,然后继续进行匹配的时候,返回

但事实是不会。正则表达式将会匹配“first”。很显然这不是我们想要的结果。原因在于“+”是贪婪的。也就是说,“+”会导致正则表达式引擎试图尽可能的重复前导字符。只有当这种重复会引起整个正则表达式匹配失败的情况下,引擎会进行回溯。也就是说,它会放弃最后一次的“重复”,然后处理正则表达式余下的部分。

和“+”类似,“?*”的重复也是贪婪的。

?深入正则表达式引擎内部

让我们来看看正则引擎如何匹配前面的例子。第一个记号是“<”,这是一个文字符号。第二个符号是“.”,匹配了字符“E”,然后“+”一直可以匹配其余的字符,直到一行的结束。然后到了换行符,匹配失败(“.”不匹配换行符)。于是引擎开始对下一个正则表达式符号进

行匹配。也即试图匹配“>”。到目前为止,“<.+”已经匹配了“first test”。引擎会试图将“>”与换行符进行匹配,结果失败了。于是引擎进行回溯。结果是现在“<.+”匹配“first test”。于是引擎将“>”与“t”进行匹配。显然还是会失败。这个过程继续,直到“<.+”匹配“first”与“>”匹配。于是引擎找到了一个匹配“first”。记住,正则导向的引擎是“急切的”,所以它会急着报告它找到的第一个匹配。而不是继续回溯,即使可能会有更好的匹配,例如“”。所以我们可以看到,由于“+”的贪婪性,使得正则表达式引擎返回了一个最左边的最长的匹配。

?用懒惰性取代贪婪性

一个用于修正以上问题的可能方案是用“+”的惰性代替贪婪性。你可以在“+”后面紧跟一个问号“?”来达到这一点。“*”,“{}”和“?”表示的重复也可以用这个方案。因此在上面的例子中我们可以使用“<.+?>”。让我们再来看看正则表达式引擎的处理过程。

再一次,正则表达式记号“<”会匹配字符串的第一个“<”。下一个正则记号是“.”。这次是一个懒惰的“+”来重复上一个字符。这告诉正则引擎,尽可能少的重复上一个字符。因此引擎匹配“.”和字符“E”,然后用“>”匹配“M”,结果失败了。引擎会进行回溯,和上一个例子不同,因为是惰性重复,所以引擎是扩展惰性重复而不是减少,于是“<.+”现在被扩展为“”。这次得到了一个成功匹配。引擎于是报告“”是一个成功的匹配。整个过程大致如此。

?惰性扩展的一个替代方案

我们还有一个更好的替代方案。可以用一个贪婪重复与一个取反字符集:“<[^>]+>”。之所以说这是一个更好的方案在于使用惰性重复时,引擎会在找到一个成功匹配前对每一个字符进行回溯。而使用取反字符集则不需要进行回溯。

最后要记住的是,本教程仅仅谈到的是正则导向的引擎。文本导向的引擎是不回溯的。但是同时他们也不支持惰性重复操作。

7. 使用“.”匹配几乎任意字符

在正则表达式中,“.”是最常用的符号之一。不幸的是,它也是最容易被误用的符号之一。

“.”匹配一个单个的字符而不用关心被匹配的字符是什么。唯一的例外是换行符。在本教程中谈到的引擎,缺省情况下都是不匹配换行符的。因此在缺省情况下,“.”等于是字符集[^\n\r](Window)或[^\n]( Unix)的简写。

这个例外是因为历史的原因。因为早期使用正则表达式的工具是基于行的。它们都是一行一行的读入一个文件,将正则表达式分别应用到每一行上去。在这些工具中,字符串是不包含换行符的。因此“.”也就从不匹配新行符。

现代的工具和语言能够将正则表达式应用到很大的字符串甚至整个文件上去。本教程讨论的所有正则表达式实现都提供一个选项,可以使“.”匹配所有的字符,包括换行符。在RegexBuddy, EditPad Pro或PowerGREP等工具中,你可以简单的选中“点号匹配换行符”。在Perl中,“.”可以匹配换行符的模式被称作“单行模式”。很不幸,这是一个很容易

混淆的名词。因为还有所谓“多行模式”。多行模式只影响行首行尾的锚定(anchor),而单行模式只影响“.”。

其他语言和正则表达式库也采用了Perl的术语定义。当在.NET Framework中使用正则表达式类时,你可以用类似下面的语句来激活单行模式:

Regex.Match(“string”,”regex”, RegexOptions.SingleLine)

?保守的使用点号“.”

点号可以说是最强大的元字符。它允许你偷懒:用一个点号,就能匹配几乎所有的字符。但是问题在于,它也常常会匹配不该匹配的字符。

我会以一个简单的例子来说明。让我们看看如何匹配一个具有“mm/dd/yy”格式的日期,但是我们想允许用户来选择分隔符。很快能想到的一个方案是<<\d\d.\d\d.\d\d>>。看上去它能匹配日期“02/12/03”。问题在于02512703也会被认为是一个有效的日期。

<<\d\d[-/.]\d\d[-/.]\d\d>>看上去是一个好一点的解决方案。记住点号在一个字符集里不是元字符。这个方案远不够完善,它会匹配“99/99/99”。而

<<[0-1]\d[-/.][0-3]\d[-/.]\d\d>>又更进一步。尽管他也会匹配“19/39/99”。你想要你的正则表达式达到如何完美的程度取决于你想达到什么样的目的。如果你想校验用户输入,则需要尽可能的完美。如果你只是想分析一个已知的源,并且我们知道没有错误的数据,用一个比较好的正则表达式来匹配你想要搜寻的字符就已经足够。

8. 字符串开始和结束的锚定

锚定和一般的正则表达式符号不同,它不匹配任何字符。相反,他们匹配的是字符之前或之后的位置。“^”匹配一行字符串第一个字符前的位置。<<^a>>将会匹配字符串“abc”中的a。<<^b>>将不会匹配“abc”中的任何字符。

类似的,$匹配字符串中最后一个字符的后面的位置。所以<>匹配“abc”中的c。

?锚定的应用

在编程语言中校验用户输入时,使用锚定是非常重要的。如果你想校验用户的输入为整数,用<<^\d+$>>。

用户输入中,常常会有多余的前导空格或结束空格。你可以用<<^\s*>>和

<<\s*$>>来匹配前导空格或结束空格。

?使用“^”和“$”作为行的开始和结束锚定

如果你有一个包含了多行的字符串。例如:“first line\n\rsecond line”(其中\n\r表示一个新行符)。常常需要对每行分别处理而不是整个字符串。因此,几乎所有的正则表达式引擎都提供一个选项,可以扩展这两种锚定的含义。“^”可以匹配字串的开始位置(在f

之前),以及每一个新行符的后面位置(在\n\r和s之间)。类似的,$会匹配字串的结束位置(最后一个e之后),以及每个换行符的前面(在e与\n\r之间)。

在.NET中,当你使用如下代码时,将会定义锚定匹配每一个新行符的前面和后面位置:Regex.Match("string", "regex", RegexOptions.Multiline)

应用:string str = Regex.Replace(Original, "^", "> ", RegexOptions.Multiline) -- 将会在每行的行首插入“> ”。

?绝对锚定

<<\A>>只匹配整个字符串的开始位置,<<\Z>>只匹配整个字符串的结束位置。即使你使用了“多行模式”,<<\A>>和<<\Z>>也从不匹配新行符。

即使\Z和$只匹配字符串的结束位置,仍然有一个例外的情况。如果字符串以换行符结束,则\Z和$将会匹配换行符前面的位置,而不是整个字符串的最后面。这个“改进”是由Perl引进的,然后被许多的正则表达式实现所遵循,包括Java,.NET等。如果应用

<<^[a-z]+$>>到“joe\n”,则匹配结果是“joe”而不是“joe\n”。

10分钟学会使用L7防火墙

10分钟学习写正则表达式和使用L7防火墙(以封WINBOX为例) 此短文简单介绍使用了L7配合防火墙禁WINBOX登录,大家可以举一反三,封什么都是可以的,即使它的服务器地址或端口经常变化也一样能封. 我现在想禁WINBOX登录,假设WINBOX的端口经常变动或者也使用与网页一样的80端口(仅仅是假设一下),这时我就不能简单地用禁端口的方法来禁WINBOX.此时可以使用L7配合防火墙过滤器来禁WINBOX登录.下面是操作步步骤: 本帖隐藏的内容 为了抓包方便,关闭WINBOX客户端机器上所有网络软件,再打开wireshark或ethereal来抓包.然后使用WINBOX登录路由器,此时抓包工具会抓到很多数据包,如图. 找到从winbox客户机(192.168.1.210)到routeros路由器(202.1.1.2)的第一个拥有Data 字段的数据包.在此数据包中选中的部分即是WINBOX登录时的特征码,此例我们选DATA字段前5个字符应该可以了.这5个连续字符使用正则表达式表达即是 \x12\x02\x69\x6e\x64\x65或者是\x12\x02ind.使用下面两条命令,你就不能再使用WINBOX登录路由器了. /ip firewall layer7-protocol

add comment="" name=winbox regexp="\\x12\\x02\\x69\\x6e\\x64" /ip firewall filter add chain=input layer7-protocol=winbox action=drop (因为使用winbox是进入路由器的连接,所以加到input链表,如果是封QQ或PPS等,过滤过则要加到forward链表) 这样就结束了,简单吧!

正则表达式教程

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

《JavaScript编程》课程标准

《JavaScript编程》课程标准 课程类型理论+实践课 课程性质必修课 学时及学分36,2 适用专业(群) 执笔人 课程组审核 系(中心)审核 二〇一五年4月

《JavaScript编程》课程标准 一、课程定位 《JavaScript编程》课程是高职高专计算机网络、计算机信息安全和计算机类各专业的专业基础课和职业素质必修课。《JavaScript编程》是一门学习制作网站的课程。通过对本课程的学习,学生将能够使用JavaScript制作网页客户端特效,实现页面特效、动画、用户反馈等功能,从而达到美化网页的效果。《JavaScript编程》属于专业必修课程。 先修课程为:HTML与页面开发。 二、课程设计的理念与思路 本课程方案的设计进一步强化实践训练课程的比重,突出学生能力培养,科学处理讲、练关系,按照三个“三分之一”的比例设计课程并组织教学,三分之一的教学内容采取讲授方式组织教学,三分之一的内容以边讲边练的方式组织教学,三分之一的内容以训练方式组织教学。 在通过教学内容的优化组合,突出实用性和先进性,突出“强调动手、加强实践、培养兴趣、积极创新”的理念,实施循序渐进,实施“基础→综合→系统→创新”的教学体系,打破以往只重视基础内容的教学模式。“基础→综合→系统→创新”的教学体系,就是强调基本概念、基础内容,但不局限;在教学过程中引导学生根据基本内容综合基本知识,升华基本规律,结合工程应用,达到举一反三,使大多数同学能够掌握教材基本内容和重点内容;教学内容各模块基本掌握的情况下,教师注重从系统整体分析与设计角度出发,从更高层次让学生进一步掌握基本内容和重点内容,使学习优秀的同学能够利用基本知识,从系统角度分析教学内容各模块,最终实现学习方法创新及基本教学内容在创新实践中的应用。 三、课程目标 本课程的总目标是:“以学生为主体,以学生的学习为中心”,通过课程的实施,帮助学生学会学习。使学生的知识、情感、技能得到全面发展,既为今后的专业课程学习打下良好的知识与技能基础,又培养良好的态度,为其将来从事专业活动和未来的职业生涯打下基础。课程内容以“学其所用,用其所学”突出高职教育特点,确保人才培养目标的实现。 《JavaScript编程》课程是网页设计的提升课程,通过对本课程的学习,学员能够掌握如何使网站的视觉效果更干净、整洁和美观,加强网页的特效。增强学员的实际动手能力和综合分析问题的能力。

编译原理第3章 习题解答

第3章习题解答 1.构造正规式1(0|1)*101相应的DFA. [答案] 先构造NFA ============================================================== 2.将下图确定化:

[答案] 重新命名,令VQ为A、QU为B、VZ为C、V为D、QUZ为E、Z为F。 ================================================================ 3.把下图最小化: [答案] (1)初始分划得Π0:终态组{0},非终态组{1,2,3,4,5}

对非终态组进行审查: {1,2,3,4,5}a {0,1,3,5} 而{0,1,3,5}既不属于{0},也不属于{1,2,3,4,5} ∵{4} a {0},所以得新分划 (2)Π1:{0},{4},{1,2,3,5} 对{1,2,3,5}进行审查: ∵{1,5} b {4} {2,3} b {1,2,3,5},故得新分划 (3)Π2:{0},{4},{1, 5},{2,3} {1, 5} a {1, 5} {2,3} a {1,3},故状态2和状态3不等价,得新分划 (3)Π3:{0},{2},{3},{4},{1, 5} 这是最后分划了 (4)最小DFA : ======================================= 4.构造一个DFA ,它接收Σ={0,1}上所有满足如下条件的字符串:每个1都有0直接跟在右边。并给出该语言的正规式和正规文法。 [答案] 按题意相应的正规表达式是0*(100*)*0* 构造相应的DFA ,首先构造NFA 为 用子集法确定化 可最小化,终态组为G1={C, D},非终态组为G2={S, A, B} 对于G2分析:f(S,0)=A, f(A,0)=A, 后继状态均属于G2 而f(B,0)=C, 后继状态属于G1 将G2分割成G21={S ,A}, G22={B}

正则表达式教程

正则表达式教程 早期起源 正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。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 尽管这种搜索文件的方法肯定很有用,但也十分有限。? 和* 通配符的有限能

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

《易语言“正则表达式”教程》 本文改编自多个文档,因此如有雷同,不是巧合。 “正则表达式”的应用范围越来越广,有了这个强大的工具,我们可以做很多事情,如搜索一句话中某个特定的数据,屏蔽掉一些非法贴子的发言,网页中匹配特定数据,代码编辑框中字符的高亮等等,这都可以用正则表达式来完成。 本书分为四个部分。 第一部分介绍了易语言的正则表达式支持库,在这里,大家可以了解第一个正则表达式的易语言程序写法,以及一个通用的小工具的制作。 第二部分介绍了正则表达式的基本语法,大家可以用上述的小工具进行试验。 第三部分介绍了用易语言写的正则表达式工具的使用方法。这些工具是由易语言用户提供的,有的工具还带有易语言源码。他们是: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)

MySQL Crash Course 实验指导手册

《MySQL必知必会》实验指导书 广州番禺职业技术学院 信息工程学院 2012.2

实验一MySQL工具的使用和数据库的简单查询 一、实验目的 1、熟悉MySQL命令行实用程序的使用。 2、学会用命令行工具了解数据库和表的相关信息。 3、掌握简单的SQL语句的使用,学会运用SQL语句进行简单的查询。 二、实验理论基础及教材对应关系 1、实验理论基础: (1)MySQL基本命令; (2)SELECT语句; 2、本实验内容主要对应于教材第3章和第4章。 三、实验内容与步骤 1、检查所用的计算机习题,确认是否已经安装了MySQL数据库管理软件。如果系统安装了MySQL Server 5.0 ,可以通过“开始”菜单—>程序->MySQL-> MySQL Server 5.0-> MySQL Command Client 开启MySQL服务。如下图: 2.连接到MySQL:主机名,端口号,合法的用法名等都已经在在安装设置过程中配置好了,在此只要输入口令:root就能登陆了

另外一种途径: 使用net start mysql 启动myql服务(如果没有启动的话。提示:使用net stop mysql 关闭服务) 然后:使用mysql –uroot –proot进入管理界面。假设root帐号的密码是root 3.查看已经存在的数据库:在mysql> 提示符后输入命令Show databases ; 后,可以看到如下的结果: 表明有三个数据库:information_schema,mysql,test等。 4.查看数据库中的表:(1)用“use”命令选择要操作的数据库,如use mysql; 回车后可以看到“Database changed”表示选择该数据库成功。 (2)输入命令“Show tables;”回车后可以看到所显示的mysql数据库中的表

RegexBuddy工具的使用教程

RegexBuddy工具的使用教程(图文)1 2009-10-14 12:14 一、什么是RegexBuddy 使用了几天,个人感觉RegexBuddy 是学习正则表达式时的比较好的帮手。它可以容易地建立你想要的正确的正则表达式。清晰地推断他人所写的复杂的正则表达式。它还可以用给出的实例字符串或文件快速地进行测试匹配,从而防止了在实际应用中出现错误。RegexBuddy会在你的源代码中根据你所应用的特殊编程语言,自动生成带有正则表达式的代码段。同时你也可以收集正则表达式到库中,以在未来重新使用。 二、获得RegexBuddy 目前最新的版本是3.2.1(图2-1),于2008年12月9日发布的。可以在https://www.360docs.net/doc/9215102796.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)。

php的正则表达式完全手册

php的正则表达式完全手册 前言 正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。 索引 1._引子 2._正则表达式的历史 3._正则表达式定义 3.1_普通字符 3.2_非打印字符 3.3_特殊字符 3.4_限定符 3.5_定位符 3.6_选择 3.7_后向引用 4._各种操作符的运算优先级 5._全部符号解释 6._部分例子 7._正则表达式匹配规则 7.1_基本模式匹配 7.2_字符簇 7.3_确定重复出现 1. 引子 目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。 正则表达式的使用,可以通过简单的办法来实现强大的功能。为了简单有效而又不失强大,造成了正则表达式代码的难度较大,学习起来也不是很容易,所以需要付出一些努力才行,入门之后参照一定的参考,使用起来还是比较简单有效的。 例子: ^.+@.+\\..+$ 这样的代码曾经多次把我自己给吓退过。可能很多人也是被这样的代码给吓跑的吧。继续阅读本文将让你也可以自由应用这样的代码。 注意:这里的第7部分跟前面的内容看起来似乎有些重复,目的是把前面表格里的部分重新描述了一次,目的是让这些内容更容易理解。 2. 正则表达式的历史 正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。 1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。 随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。 如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。 3. 正则表达式定义 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。

编译原理作业集-第三章-修订版

第三章词法分析 本章要点 1.词法分析器设计, 2.正规表达式与有限自动机, 3.词法分析器自动生成。 本章目标: 1.理解对词法分析器的任务,掌握词法分析器的设计; 2.掌握正规表达式与有限自动机; 3.掌握词法分析器的自动产生。 本章重点: 1.词法分析器的作用和接口,用高级语言编写词法分析器等内容,它们与词法分析器的实现有关。应重点掌握词法分析器的任务与设计,状态转换图等内容。 2.掌握下面涉及的一些概念,它们之间转换的技巧、方法或算法。 (1)非形式描述的语言 ? 正规式 (2)正规式 ? NFA(非确定的有限自动机) (3)NFA ? DFA(确定的有限自动机) (4)DFA ? 最简DFA 本章难点 (1)非形式描述的语言 ? 正规式 (2)正规式 ? NFA(非确定的有限自动机) (3) NFA ? DFA(确定的有限自动机) (4) DFA ? 最简DFA

作业题 一、单项选择题 (按照组卷方案,至少15道) 1. 程序语言下面的单词符号中,一般不需要超前搜索 a. 关键字 b. 标识符 c. 常数 d. 算符和界符 2. 在状态转换图的实现中,一般对应一个循环语句 a. 不含回路的分叉结点 b. 含回路的状态结点 c. 终态结点 d. 都不是 3. 用了表示字母,d表示数字,?={l,d},则定义标识符的正则表达式可以是:。 (a)ld* (b)ll* (c)l(l | d)* (d)ll* | d* 4. 正规表达式(ε|a|b)2表示的集合是 (a){ε,ab,ba,aa,bb} (b){ab,ba,aa,bb} (c){a,b,ab,aa,ba,bb} (d){ε,a,b,aa,bb,ab,ba} 5. 有限状态自动机可用五元组(V T,Q,δ,q0,Q f)来描述,设有一有限状态自动机M的定义如下: V T={0, 1},Q={q0, q1, q2},Q f={q2},δ的定义为: δ(q0,0)=q1δ(q1,0)=q2 δ(q2,1)=q2δ(q2,0)=q2 M所对应的状态转换图为。

正则表达式经典教程

正则表达式是常见常忘,所以还是记下来比较保险,于是就有了这篇笔记。 希望对大家会有所帮助。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 早期工作的基础上,发表了一篇标题为?神经网事件的表示法?的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为?正则集的代数?的表达式,因此采用?正则表达式?这个术语。

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软件开发环境.

Shell基本语法结构

☆掌握Shell的基本语法结构。 ☆学会编写并执行Shell脚本程序。 ☆学会在Linux下进行进程调度和作业调度 任务一学习变量与表达式 Shell是操作系统最外面的一层,负责管理用户与操作系统之间的交互,例如等待用户输入,向操作系统解释用户的输入,以及处理操作系统的各种输出结果。 除了作为命令解释器之外,Shell本身还是一个解释型的程序设计语言。Shell程序设计语言支持变量、表达式、函数和流程控制结构等,任何在终端能够执行的命令也放到Shell程序。 ● 4.1.1 变量 ●在Shell中有三种变量:系统变量、环境变量和用户变量。其中系统变量在对参数判 断和命令返回值判断会使用,环境变量主要是在程序运行的时候需要设置,用户变量在编程过程中使用最多。 ●这几种变量的赋值方法各不相同,主要有:直接设置变量值、变量之间的置换、从 命令行参数获取、从环境变量获取和用户输入等几种方式。 ●引用变量一般采用“$variable”的形式引用变量variable的值。 1.系统变量 ●Shell常用的系统变量用于提供系统信息。系统变量一般采用命令行参数获取。 2.环境变量 ●Shell在开始执行前就已经定义了一些与系统工作环境有关的变量。 ●显示环境变量用echo命令。 ●在bash中,设置环境变量用set命令。用unset命令可将环境变量重新设置为系统 默认值,。 ●用户并不需要每次登录后都对各种环境变量进行手工设置,通过环境设置文件,用 户的工作环境的设置可以在登录的时候由系统自动来完成。环境设置文件有两种:系统环境设置文件和用户环境设置文件。 ●

3.用户变量 ●不管系统变量和环境变量有多少,对于需求来说,总是不够的。用户常常需要自定 义一些变量,这些变量就称为用户变量。 ●定义用户变量的语法为: ●name=string ●局部变量与全局变量 Shell变量也有其规定的作用范围。局部变量的作用范围仅仅在其命令行所在的Shell 或Shell脚本文件中。全局变量的作用范围则包括本Shell进程及其所有子进程,即相当于环境变量,贯穿于整个当前用户环境。可以使用export命令将局部变量设置为全局变量。 export name=string ●【操作实例4.1】 用文本编辑器gedit编写一个Shell脚本test1.sh,显示执行脚本时输入的参数及参数总数目,并定义一个局部变量和一个全局变量。 4.1.2 表达式 Shell中的表达式分为算术运算表达式、关系与逻辑表达式和正则表达式等几种。 1.expr命令 ●expr命令的功能是求表达式的值。 2. 算术表达式 ●算术表达式可以是由运算符+、-、*、/、=组成的表达式。 3. 关系与逻辑表达式 ●命令test与方括号[ ]都用于进行条件测试,测试的结果返回逻辑值,即真true(0)和 假false(1)。test和[ ]可以相互替换。 ● ●

第三章 词法分析(3)

第3章词法分析

3.5 有穷自动机 ?有穷自动机是一个更一般化的状态转换图,是一个语言的识别器(recognizer),对输入的串说 “yes”or “no” ?确定的和不确定 ?识别的语言恰好是正规表达式所能描述的语言 ?介绍三类有穷自动机 ?NFA ? -NFA ?DFA

3.5.1 不确定的有穷自动机 ?不确定的有穷自动机(Non-Deterministic Finite Automata,简称NFA)是一个五元组 M=(∑,S,δ,s0,F),其中: ?输入符号集合∑; ?状态集合S; ?转移函数δ:S?(∑?{ε})→P(S); ?可以用转换图或转移表表示 ?状态s 0是开始状态,s ∈S; ?F?S,接受状态(终止状态)集合。

S = { 0, 1, 2, 3 } s 0= 0F = { 3 } = { a, b } 例3.14 识别语言(a|b)*abb 的NFA 转换图(Transition Diagrams ) 1 start a 0a b b 3 b 2

输入符号a b 0{0, 1}{0}1 ? {2} 2?{3}状态 识别语言(a|b)*abb 的NFA 转换表(Transition Tables ) 1start a 0a b b 3 b 2

例,Input: ababb 接受输入字符串ababb 的状态转移序列 1 start a 0a b b 3 b 2 ? 210000*********?→??→??→??→??→??→??→??→??→??→??→??→??→?a b a b b a b a b b a b a ACCEPT !

八爪鱼采集器正则表达式入门教程

https://www.360docs.net/doc/9215102796.html, 八爪鱼采集器正则表达式入门教程 正则表达式(Regular Expression),按英文直译是“规范化表达”,其作用是将复杂模糊的源数据通过正则表达式转化为简单直观的目标数据。例如: “150ABCD” “一百五ABCD” “One hundred and fiftyABCD” 分析思考过程: 以上字符串中,我们的源数据数据分别为:““150ABCD”、“一百五ABCD”、“One hundred and fiftyABCD” 假设我们要提取目标数据为:字符串中以数字开头的数据 那么我们约束条件为:只取字符串中以数字开头的源数据 将此约束条件转化为正则表达式为:[0-9](.+)\b 其中,[0-9]的语义为开头1位为0-9开头,中间间隔以通配符“.”代替,(.+)语义为字符串长度不做限定,\b的语义为,匹配一个边界。

https://www.360docs.net/doc/9215102796.html, 正则后的目标数据:“150ABCD” 通过这个简单例子,我们大致了解到了为什么要用正则与正则所能实现的效果,讲通俗点就是,正则只是将我们的意愿(提取字符串中以数字开头的数据)以表达式的形式展现出来([0-9](.+)\b),并最终通过表达式匹配到所需要的目标数据(“150ABCD”),所以灵活运用正则,可以通过简单的方法实现强大的功能。 为什么要在八爪鱼中使用正则? 在八爪鱼采集数据过程中,受限于网页HTML结构的原因,部分目标数据并不能单独提取出来,这时需要简单的搜索与替换操作来提取与预期搜索结果匹配的确切文本,除此之外,对数据要求精准规范的用户,还能通过正则表达式测试所提取数据字符串的模式、替换文本、基于匹配模式从字符串中提取子字符串等操作。 例如: 匹配字符串内模式: 1.查看字符串是否出现电话号码模式 2.查看字符串是否出现网址URL模式 替换文本:

VBA正则表达式

EXCEL本身的替换功能已经带有部分,word的更牛,但也未达到正则表达式的精华部分那种功能。摘录部分内容共享:来自Henry Spencer 1. 概述 正则表达式原本是形式语言理论中的概念,与编译器的构造有密切的联系。但是作为一个应用软件的用户,我们没有必要去细究正则表达式的严格定义和处理方法。本文将从实用的角度出发,阐述引入正则表达式的目的、正则表达式的命令格式,以及如何利用正则表达式完成一些实际的文本处理工作。 我们在处理文本时,经常会遇到一些具有某种特定格式,或者说满足某种规则的文本。比如,一个无符号的整数由一连串的数字构成,而一个Email地址的格式则是“用户名@主机名”,其中用户名是一串字母或数字,主机名则是由若干个由“.”分隔的字母数字串。正则表达式就是用来指定这种规则的。如果某个字符串满足正则表达式指定的规则,则称该字符串为正则表达式的一个“匹配串”。 2. 正则表达式的构成 为了方便理解,让我们先来看看大家比较熟悉的数学表达式,“(x+3)*2+y”是一个典型的数学表达式。一个数学表达式由若干个“项”组成,“项”与“项”之间用加号或减号相连;这里“(x+3)*2”和“y”分别是两个项。每个项又由若干个“因子”组成,因子之间用乘号或除号相连;这里第一个项有两个因子“(x+3)”和“2”,而第二个项只有一个因子“y”。每个因子可以是一个简单的数,一个代数变量,

也可以是放在括号里面的另一个表达式。对于最后一种情况,括号中的表达式称为“子表达式”;这里“x+3”就是一个子表达式。 正则表达式的结构与数学表达式很相似。与数学表达式的“项”相对应,正则表达式由若干个“分支”构成,“分支”之间用符号“|”相连。从逻辑上讲,分支之间是一种“或”的关系,一个字符串只要与正则表达式中的任何一个分支相匹配,这个字符串就与整个正则表达式相匹配。比如,“第三人称代词”可以用正则表达式表示为“他|她|它|他们|她们|它们”。 与数学表达式的“因子”相对应,构成正则表达式“分支”的部件称为“原子”。“原子”与“原子”之间没有任何符号相连。从逻辑上讲,原子之间是串接的关系,一个字符串必须与各个原子依次相匹配,才算与这个分支相匹配。比如在上面的例子中,分支“他们”由两个原子“他”和“们”组成。 正则表达式的本质是它的“原子”可以有多种不同的形式。前面的例子是最简单的情形,即每个原子由一个普通字符组成。除此以外,“原子”还可以是特殊符号、通配符、字符集以及子表达式。 2.1 特殊符号 可以作为特殊符号的原子有: ^ 匹配行首。例如,“^他”匹配出现在行首的“他” 字。值得注意的是,这个符号仅仅表示“行首”这个位置,与它相匹配的字符串长度为0; $ 匹配行末。与“^”相似,它仅表示“行末”这个位置。例如,“。$”匹配出现在行末的句号;

半小时精通正则表达式

相册 广场 游戏 河外星系的船长 退出 关注此空间vbs小铺 平静的力量在深的海 半小时精通正则表达式 2006-10-21 17:25 跟我学正则表达式! 想必很多人都对正则表达式都头疼.今天,我以我的认识,加上网上一些文章,希望用常人都可以理解的表达方式.来和大家分享学习经验. 开篇,还是得说说 ^ 和 $ 他们是分别用来匹配字符串的开始和结束,以下分别举例说明 "^The": 开头一定要有"The"字符串; "of despair$": 结尾一定要有"of despair" 的字符串; 那么, "^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配 "notice": 匹配包含notice的字符串 你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边 接着,说说 '*', '+',和 '?', 他们用来表示一个字符可以出现的次数或者顺序. 他们分别表示: "zero or more"相当于{0,}, "one or more"相当于{1,}, "zero or one."相当于{0,1}, 这里是一些例子: "ab*": 和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串("a", "ab", "abbb", 等); "ab+": 和ab{1,}同义,同上条一样,但最少要有一个b存在 ("ab", "abbb", 等.); "ab?":和ab{0,1}同义,可以没有或者只有一个b; "a?b+$": 匹配以一个或者0个a再加上一个以上的b结尾的字符串. 要点, '*', '+',和 '?'只管它前面那个字符. 你也可以在大括号里面限制字符出现的个数,比如 "ab{2}": 要求a后面一定要跟两个b(一个也不能少)("abb"); "ab{2,}": 要求a后面一定要有两个或者两个以上b(如"abb", "abbbb", 等.); "ab{3,5}": 要求a后面可以有2-5个b("abbb", "abbbb", or "abbbbb"). 现在我们把一定几个字符放到小括号里,比如:

如何修炼你的Java项目经验(项目经理必知)

Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1、掌握项目开发的基本步骤 2、具备极强的面向对象的分析与设计技巧 3、掌握用例驱动、以架构为核心的主流开发方法 没有人愿意自己一辈子就满足于掌握了一些代码实现的技巧,别人告诉你要实现什么,你就用代码堆砌来实现别人的要求!你必须学会从整个项目的角度去思考!你必须学会假如你是项目经理,你该如何思考!你必须学会假如你是架构师,你该如何思考!你必须掌握针对某个特定问题领域的分析方法! 关于基础知识:你可以看看这些名词或知识点,看是否能说出个一二三四来。 JavaSE ----基本语法、数据类型、操作符等:int、long、Integer、Long、if、else、for、while ----面向对象:class(类)、Object(对象)、instance(实例)、state(状态)、behavior(行为)、field、method、new、可见性(访问控制)、attribute、property、package、import、static variable、class variable、instance variable、heap、method area、stack、GC(垃圾回收)、override、overload、对象转型(casting)、多态、this、super ----异常处理:理解编译期错误和运行期错误的区别、Exception、RuntimeException、checked exception、unchecked exception、try、catch、finally、throw new XXXException、throws XXXException、异常处理的基本原则 ----数组与集合:数组的定义和使用方法、Collection、List、Set、Map、ArrayList、HashSet、HashMap、Iterator、equals、hashCode、Comparable、Comparator ----常用类:String、intern、常量池、StringBuffer、java.util.Date、SimpleDateFormat、Regex (正则表达式) ----反射机制:Class、Method、Field、invoke、newInstance、BeanUtils(apache-commons)、PropertyUtils(apache-commons) ----输入输出流:InputStream、OutputStream、Reader、Writer、Adapter设计模式与原始流类、Decorator设计模式与包装流类、对象序列化和反序列化 ----多线程:Thread、Runnable、sleep、wait、notify、synchronized、lock Servlet和JSP ----HttpServlet、doGet、doPost、HttpServletRequest、HttpServletResponse、request.getParameter()、request.setAttribute()、request.getAttribute()、request.getSession()、ServletContext、Filter、web.xml、tomcat、forward与redirect、http协议的无状态性、cookie、JSP Scope Object、 HTML与JavaScript ----你需要能够理解常见的网页标签、理解在网页中引入JavaScript的方法、以及JavaScript 的基本语法与使用方法 以上,就是你进一步学习Java所必备的基本知识。特别是一些个专业术语和名词,看到这些名词,如果你像看到亲爹一样亲切,那么说明你对Java的基础知识就很熟悉了。

十分钟学会正则表达式

1.精通正则表达式 2.function isTrueName(s) 3.{ 4.var patrn=/^[a-zA-Z]{1,30}$/; 5.if (!patrn.exec(s)) return false 6.return true 7.} 8.}} 9. 10.//校验密码:只能输入6-20个字母、数字、下划线 11.

function isPasswd(s) 12.{ 13.var patrn=/^(\w){6,20}$/; 14.if (!patrn.exec(s)) return false 15.return true 16.} 17.
18.
19.
//校验普通电话、传真号码:可以“+”开头,除数字外,可含有 “-” 20.
function isTel(s) 21.{ 22.//var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/; 23.var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; 24.if (!patrn.exec(s)) return false 25.return true 26.} 27.
28.
29.
//校验手机号码:必须以数字开头,除数字外,可含有“-” 30.
function isMobil(s) 31.{ 32.var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/; 33.if (!patrn.exec(s)) return false 34.return true 35.} 36.
37.
38.
//校验邮政编码 39.
function isPostalCode(s) 40.{ 41.//var patrn=/^[a-zA-Z0-9]{3,12}$/; 42.var patrn=/^[a-zA-Z0-9 ]{3,12}$/; 43.if (!patrn.exec(s)) return false