仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 351|回复: 7
打印 上一主题 下一主题

[学习教程] ASP网页设计深切浅出进修正则表达式

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:18:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
ASP最大的缺点在于网络的安全性和可靠性,企业将经营数据放在开放的平台上,最大的担忧就是如何保证这些数据不被其他人破坏。正则媒介:
半年前我对正则表达式发生了乐趣,在网上查找过很多材料,看过很多的教程,最初在利用一个正则表达式工具RegexBuddy时发明他的教程写的十分好,能够说是我今朝见过最好的正则表达式教程。因而一向想把他翻译过去。这个希望直到这个五一长假才得以完成,了局就有了这篇文章。关于本文的名字,利用“深切浅出”仿佛已太俗。可是通读原文今后,以为只要用“深切浅出”才干正确的表达出该教程给我的感觉,以是也就不克不及免俗了。
本文是JanGoyvaerts为RegexBuddy写的教程的译文,版权回原作者一切,接待转载。可是为了尊敬原作者和译者的休息,请说明出处!感谢!
1.甚么是正则表达式
基础说来,正则表达式是一种用来形貌必定数目文本的形式。Regex代表RegularExpress。本文将用<<regex>>来暗示一段详细的正则表达式。
一段文本就是最基础的形式,复杂的婚配不异的文本。
2.分歧的正则表达式引擎
正则表达式引擎是一种能够处置正则表达式的软件。一般,引擎是更年夜的使用程序的一部分。在软件天下,分歧的正则表达式其实不相互兼容。本教程会合中会商Perl5范例的引擎,由于这类引擎是使用最普遍的引擎。同时我们也会提到一些和其他引擎的区分。很多近代的引擎都很相似,但不完整一样。比方.NET正则库,JDK正则包。
3.笔墨标记
最基础的正则表达式由单个笔墨标记构成。如<<a>>,它将婚配字符串中第一次呈现的字符“a”。如对字符串“Jackisaboy”。“J”后的“a”将被婚配。而第二个“a”将不会被婚配。
正则表达式也能够婚配第二个“a”,这必需是你告知正则表达式引擎从第一次婚配的中央入手下手搜刮。在文本编纂器中,你可使用“查找下一个”。在编程言语中,会有一个函数可使你夙昔一次婚配的地位入手下手持续向后搜刮。
相似的,<<cat>>会婚配“Aboutcatsanddogs”中的“cat”。这即是是告知正则表达式引擎,找到一个<<c>>,紧跟一个<<a>>,再跟一个<<t>>。
要注重,正则表达式引擎缺省是巨细写敏感的。除非你告知引擎疏忽巨细写,不然<<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:        emp”,你要用正则表达式<<C:        emp>>。而在C++中,正则表达式则酿成了“C:\temp”。
・不成显现字符
可使用特别字符序列来代表某些不成显现字符:
<<        >>代表Tab(0x09)
<<>>代表回车符(0x0D)
<<
>>代表换行符(0x0A)
要注重的是Windows中文本文件利用“
”来停止一行而Unix利用“
”。
4.正则表达式引擎的外部事情机制
晓得正则表达式引擎是怎样事情的有助于你很快了解为什么某个正则表达式不像你希冀的那样事情。
有两品种型的引擎:文本导向(text-directed)的引擎和正则导向(regex-directed)的引擎。JeffreyFriedl把他们称作DFA和NFA引擎。本文谈到的是正则导向的引擎。这是由于一些十分有效的特征,如“惰性”量词(lazyquantifiers)和反向援用(backreferences),只能在正则导向的引擎中完成。以是绝不不测这类引擎是今朝最盛行的引擎。
你能够容易分辩出所利用的引擎是文本导向仍是正则导向。假如反向援用或“惰性”量词被完成,则能够一定你利用的引擎是正则导向的。你能够作以下测试:将正则表达式<<regex|regexnot>>使用到字符串“regexnot”。假如婚配的了局是regex,则引擎是正则导向的。假如了局是regexnot,则是文本导向的。由于正则导向的引擎是“猴急”的,它会很孔殷的举行表功,呈报它找到的第一个婚配。
・正则导向的引擎老是前往最右边的婚配
这是必要你了解的很主要的一点:即便今后有大概发明一个“更好”的婚配,正则导向的引擎也老是前往最右边的婚配。
当把<<cat>>使用到“Hecapturedacatfishforhiscat”,引擎先对照<<c>>和“H”,了局失利了。因而引擎再对照<<c>>和“e”,也失利了。直到第四个字符,<<c>>婚配了“c”。<<a>>婚配了第五个字符。到第六个字符<<t>>没能婚配“p”,也失利了。引擎再持续从第五个字符从头反省婚配性。直到第十五个字符入手下手,<<cat>>婚配上了“catfish”中的“cat”,正则表达式引擎孔殷的前往第一个婚配的了局,而不会再持续查找是不是有其他更好的婚配。
5.字符集
字符集是由一对方括号“[]”括起来的字符汇合。利用字符集,你能够告知正则表达式引擎仅仅婚配多个字符中的一个。假如你想婚配一个“a”或一个“e”,利用<<[ae]>>。你可使用<<gr[ae]y>>婚配gray或grey。这在你不断定你要搜刮的字符是接纳美国英语仍是英国英语时出格有效。相反,<<gr[ae]y>>将不会婚配graay或graey。字符会合的字符按次并没有甚么干系,了局都是不异的。
你可使用连字符“-”界说一个字符局限作为字符集。<<[0-9]>>婚配0到9之间的单个数字。你可使用不止一个局限。<<[0-9a-fA-F]>>婚配单个的十六进制数字,而且巨细写不敏感。你也能够分离局限界说与单个字符界说。<<[0-9a-fxA-FX]>>婚配一个十六进制数字或字母X。再次夸大一下,字符和局限界说的前后按次对了局没有影响。
・字符集的一些使用
查找一个大概有拼写毛病的单词,好比<<sep[ae]r[ae]te>>或<<li[cs]en[cs]e>>。
查找程序言语的标识符,<<A-Za-z_][A-Za-z_0-9]*>>。(*暗示反复0或屡次)
查找C作风的十六进制数<<0[xX][A-Fa-f0-9]+>>。(+暗示反复一次或屡次)
・取反字符集
在左方括号“[”前面紧跟一个尖括号“^”,将会对字符集取反。了局是字符集将婚配任何不在方括号中的字符。不像“.”,取反字符集是能够婚配回车换行符的。
必要记着的很主要的一点是,取反字符集必需要婚配一个字符。<<q[^u]>>其实不意味着:婚配一个q,前面没有u随着。它意味着:婚配一个q,前面随着一个不是u的字符。以是它不会婚配“Iraq”中的q,而会婚配“Iraqisacountry”中的q和一个空格符。现实上,空格符是婚配中的一部分,由于它是一个“不是u的字符”。
假如你只想婚配一个q,前提是q前面有一个不是u的字符,我们能够用前面将讲到的向前检察来办理。
・字符会合的元字符
必要注重的是,在字符会合只要4个字符具有特别寄义。它们是:“]^-”。“]”代表字符集界说的停止;“”代表本义;“^”代表取反;“-”代表局限界说。其他罕见的元字符在字符集界说外部都是一般字符,不必要本义。比方,要搜刮星号*或加号+,你能够用<<[+*]>>。固然,假如你对那些一般的元字符举行本义,你的正则表达式一样会事情得很好,可是这会下降可读性。
在字符集界说中为了将反斜杠“”作为一个笔墨字符而非特别寄义的字符,你必要用另外一个反斜杠对它举行本义。<<[x]>>将会婚配一个反斜杠和一个X。“]^-”都能够用反斜杠举行本义,大概将他们放在一个不成能利用到他们特别寄义的地位。我们保举后者,由于如许能够增添可读性。好比关于字符“^”,将它放在除左括号“[”前面的地位,利用的都是笔墨字符寄义而非取反寄义。如<<[x^]>>会婚配一个x或^。<<[]x]>>会婚配一个“]”或“x”。<<[-x]>>或<<[x-]>>城市婚配一个“-”或“x”。
・字符集的简写
由于一些字符集十分经常使用,以是有一些简写体例。
<<d>>代表<<[0-9]>>;
<<w>>代表单词字符。这个是随正则表达式完成的分歧而有些差别。尽年夜多半的正则表达式完成的单词字符集都包括了<<A-Za-z0-9_]>>。
<<s>>代表“白字符”。这个也是和分歧的完成有关的。在尽年夜多半的完成中,都包括了空格符和Tab符,和回车换行符<<
>>。
字符集的缩写情势能够用在方括号以内或以外。<<sd>>婚配一个白字符前面紧跟一个数字。<<[sd]>>婚配单个白字符或数字。<<[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,}和+的感化一样。
你能够用<<[1-9][0-9]{3}>>婚配1000~9999之间的数字(“”暗示单词界限)。<<[1-9][0-9]{2,4}>>婚配一个在100~99999之间的数字。
・注重贪心性
假定你想用一个正则表达式婚配一个HTML标签。你晓得输出将会是一个无效的HTML文件,因而正则表达式不必要扫除那些有效的标签。以是假如是在两个尖括号之间的内容,就应当是一个HTML标签。
很多正则表达式的老手会起首想到用正则表达式<<<.+>>>,他们会很惊奇的发明,关于测试字符串,“Thisisa<EM>first</EM>test”,你大概希冀会前往<EM>,然后持续举行婚配的时分,前往</EM>。
但现实是不会。正则表达式将会婚配“<EM>first</EM>”。很明显这不是我们想要的了局。缘故原由在于“+”是贪心的。也就是说,“+”会招致正则表达式引擎试图尽量的反复前导字符。只要当这类反复会引发全部正则表达式婚配失利的情形下,引擎会举行回溯。也就是说,它会保持最初一次的“反复”,然后处置正则表达式余下的部分。
和“+”相似,“?*”的反复也是贪心的。
・深切正则表达式引擎外部
让我们来看看正则引擎怎样婚配后面的例子。第一个暗号是“<”,这是一个笔墨标记。第二个标记是“.”,婚配了字符“E”,然后“+”一向能够婚配其他的字符,直到一行的停止。然后到了换行符,婚配失利(“.”不婚配换行符)。因而引擎入手下手对下一个正则表达式标记举行婚配。也即试图婚配“>”。到今朝为止,“<.+”已婚配了“<EM>first</EM>test”。引擎会试图将“>”与换行符举行婚配,了局失利了。因而引擎举行回溯。了局是如今“<.+”婚配“<EM>first</EM>tes”。因而引擎将“>”与“t”举行婚配。明显仍是会失利。这个历程持续,直到“<.+”婚配“<EM>first</EM”,“>”与“>”婚配。因而引擎找到了一个婚配“<EM>first</EM>”。记着,正则导向的引擎是“孔殷的”,以是它会急着呈报它找到的第一个婚配。而不是持续回溯,即便大概会有更好的婚配,比方“<EM>”。以是我们能够看到,因为“+”的贪心性,使得正则表达式引擎前往了一个最右边的最长的婚配。
・用怠惰性代替贪心性
一个用于修改以上成绩的大概计划是用“+”的惰性取代贪心性。你能够在“+”前面紧跟一个问号“?”来到达这一点。“*”,“{}”和“?”暗示的反复也能够用这个计划。因而在下面的例子中我们可使用“<.+?>”。让我们再来看看正则表达式引擎的处置历程。
再一次,正则表达式暗号“<”会婚配字符串的第一个“<”。下一个正则暗号是“.”。此次是一个怠惰的“+”来反复上一个字符。这告知正则引擎,尽量少的反复上一个字符。因而引擎婚配“.”和字符“E”,然后用“>”婚配“M”,了局失利了。引擎会举行回溯,和上一个例子分歧,由于是惰性反复,以是引擎是扩大惰性反复而不是削减,因而“<.+”如今被扩大为“<EM”。引擎持续婚配下一个暗号“>”。此次失掉了一个乐成婚配。引擎因而呈报“<EM>”是一个乐成的婚配。全部历程大抵云云。
・惰性扩大的一个替换计划
我们另有一个更好的替换计划。能够用一个贪心反复与一个取反字符集:“<[^>]+>”。之以是说这是一个更好的计划在于利用惰性反复时,引擎会在找到一个乐成婚配前对每个字符举行回溯。而利用取反字符集则不必要举行回溯。
最初要记着的是,本教程仅仅谈到的是正则导向的引擎。文本导向的引擎是不回溯的。可是同时他们也不撑持惰性反复操纵。
7.利用“.”婚配几近恣意字符
在正则表达式中,“.”是最经常使用的标记之一。不幸的是,它也是最简单被误用的标记之一。
“.”婚配一个单个的字符而不必体贴被婚配的字符是甚么。独一的破例是新行符。在本教程中谈到的引擎,缺省情形下都是不婚配新行符的。因而在缺省情形下,“.”即是是字符集[^
](Window)或[^
](Unix)的简写。
这个破例是由于汗青的缘故原由。由于初期利用正则表达式的工具是基于行的。它们都是一行一行的读进一个文件,将正则表达式分离使用到每行上往。在这些工具中,字符串是不包括新行符的。因而“.”也就从不婚配新行符。
古代的工具和言语可以将正则表达式使用到很年夜的字符串乃至全部文件上往。本教程会商的一切正则表达式完成都供应一个选项,可使“.”婚配一切的字符,包含新行符。在RegexBuddy,EditPadPro或PowerGREP等工具中,你能够复杂的选中“点号婚配新行符”。在Perl中,“.”能够婚配新行符的形式被称作“单行形式”。很不幸,这是一个很简单搅浑的名词。由于另有所谓“多行形式”。多行形式只影响行首行尾的锚定(anchor),而单行形式只影响“.”。
其他言语和正则表达式库也接纳了Perl的术语界说。当在.NETFramework中利用正则表达式类时,你能够用相似上面的语句来激活单行形式:Regex.Match(“string”,”regex”,RegexOptions.SingleLine)
・守旧的利用点号“.”
点号能够说是最壮大的元字符。它同意你偷懒:用一个点号,就可以婚配几近一切的字符。可是成绩在于,它也经常会婚配不应婚配的字符。
我会以一个复杂的例子来讲明。让我们看看怎样婚配一个具有“mm/dd/yy”格局的日期,可是我们想同意用户来选择分开符。很快能想到的一个计划是<<dd.dd.dd>>。看上往它能婚配日期“02/12/03”。成绩在于02512703也会被以为是一个无效的日期。
<<dd[-/.]dd[-/.]dd>>看上往是一个好一点的办理计划。记着点号在一个字符集里不是元字符。这个计划远不敷完美,它会婚配“99/99/99”。而<<[0-1]d[-/.][0-3]d[-/.]dd>>又更进一步。只管他也会婚配“19/39/99”。你想要你的正则表达式到达怎样完善的水平取决于你想到达甚么样的目标。假如你想校验用户输出,则必要尽量的完善。假如你只是想剖析一个已知的源,而且我们晓得没有毛病的数据,用一个对照好的正则表达式来婚配你想要征采的字符就已充足。
8.字符串入手下手和停止的锚定
锚定和一样平常的正则表达式标记分歧,它不婚配任何字符。相反,他们婚配的是字符之前或以后的地位。“^”婚配一行字符串第一个字符前的地位。<<^a>>将会婚配字符串“abc”中的a。<<^b>>将不会婚配“abc”中的任何字符。
相似的,$婚配字符串中最初一个字符的前面的地位。以是<<c$>>婚配“abc”中的c。
・锚定的使用
在编程言语中校验用户输出时,利用锚定长短常主要的。假如你想校验用户的输出为整数,用<<^d+$>>。
用户输出中,经常会有过剩的前导空格或停止空格。你能够用<<^s*>>和<<s*$>>来婚配前导空格或停止空格。
・利用“^”和“$”作为行的入手下手和停止锚定
假如你有一个包括了多行的字符串。比方:“firstline
secondline”(个中
暗示一个新行符)。经常必要对每行分离处置而不是全部字符串。因而,几近一切的正则表达式引擎都供应一个选项,能够扩大这两种锚定的寄义。“^”能够婚配字串的入手下手地位(在f之前),和每个新行符的前面地位(在
和s之间)。相似的,$会婚配字串的停止地位(最初一个e以后),和每一个新行符的后面(在e与
之间)。
在.NET中,当你利用以下代码时,将会界说锚定婚配每个新行符的后面和前面地位:Regex.Match("string","regex",RegexOptions.Multiline)
使用:stringstr=Regex.Replace(Original,"^",">",RegexOptions.Multiline)--将会在每行的行首拔出“>”。
・相对锚定
<<A>>只婚配全部字符串的入手下手地位,<<>>只婚配全部字符串的停止地位。即便你利用了“多行形式”,<<A>>和<<>>也从不婚配新行符。
即便和$只婚配字符串的停止地位,仍旧有一个破例的情形。假如字符串以新行符停止,则和$将会婚配新行符后面的地位,而不是全部字符串的最初面。这个“改善”是由Perl引进的,然后被很多的正则表达式完成所遵守,包含Java,.NET等。假如使用<<^[a-z]+$>>到“joe
”,则婚配了局是“joe”而不是“joe
”。
实现规模效益。与传统的用户拥有硬件软件所有权和使用权以及传统的应用服务商提供一对一的服务模式不同,ASP拥有应用系统所有权,用户拥有使用权,应用系统集中放在ASP的数据中心中,集中管理,分散使用,以一对多的租赁的形式为众多用户提供有品质保证的应用技术服务,实现规模效益。
柔情似水 该用户已被删除
沙发
发表于 2015-1-19 07:57:53 | 只看该作者
跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组
变相怪杰 该用户已被删除
板凳
发表于 2015-1-25 15:36:10 | 只看该作者
学习ASP其实应该上升到如何学习程序设计这种境界,其实学习程序设计又是接受一种编程思想。比如ASP如何学习,你也许在以前的学习中碰到过。以下我仔细给你说几点:
飘灵儿 该用户已被删除
地板
发表于 2015-2-2 23:40:21 | 只看该作者
以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。
愤怒的大鸟 该用户已被删除
5#
发表于 2015-2-8 19:41:05 | 只看该作者
Session:这个存储跟客户端会话过程的数据,默认20分钟失效
海妖 该用户已被删除
6#
发表于 2015-2-26 00:19:51 | 只看该作者
尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性,比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。
小魔女 该用户已被删除
7#
发表于 2015-3-8 10:48:01 | 只看该作者
用户端的浏览器不需要提供任何别的支持,这样大提高了用户与服务器之间的交互的速度。
谁可相欹 该用户已被删除
8#
发表于 2015-3-22 16:58:41 | 只看该作者
它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-25 02:33

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表