幻想编程

一起进入正则表达式的世界(1)

时间:14-03-16 01:16:12点击:356

虽说不太算js的,,但也是用js做的教程。。姑且放在这里吧

正则表达式很重要,几乎每种编程语言都会用到

先解释下,什么是正则表达式?

在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成 regex ,单数有regexp、regex,复数有regexps、regexes、regexen。

具体应用到哪呢?比如说网页表单提交

验证手机号,邮箱是否为正确格式,这就需要正则表达式了

还有很多,比如说网页采集等

基本涉及到字符串的处理多多少少都需要正则表达式

那么怎么来测试自己写的正则表达式呢

每种编程语言都有自己的正则表达式函数

我们就用js的吧,直接新建个记事本,把后缀改成html

然后加入如下代码

<input id="a" type="text" />

<input type="button" onclick='regexp(document.getElementById("a").value)' value="Test"/>

<script>

function regexp(a)

{

if(a.match("a"))

alert("Pass");

else

alert("No Pass");

}

</script>

代码很简单,懂点js就能看懂

其中a是从文本框来的字符串

match是js String对象专门用来匹配正则表达式的方法,当然js正则表达式的方法还不止match一个,这个是最常用的一个

match("a") 括号里的内容就是要匹配的内容

就是说如果a字符串内容只要包含a这个字符,就返回一个数组(就是匹配成功),反之则返回null

if(a.match(a))

如果不加 所有东东全能pass

这个是最简单的匹配入门了

只要能文本框输入 a 或者 abc,11a,6a,45a,aaaaa等

只要包含a,就能通过

<input id="a" type="text" />

<input type="button" onclick='regexp(document.getElementById("a").value)' value="Test"/> <script>

function regexp(a)

{

if(a.match("abc"))

alert("Pass");

else

alert("No Pass"); }

</script>

只要字符串包含abc就pass

ab123 ,a123b,ab12c 不通过

以下的贴我就只复制a.match("abc")这一部分了,这样也看的清楚一点

注意上面的都是区分大小写的

另外用正斜杠/包起来也能执行匹配,以后就都用//了,初期先搞清楚//和 的区别

if(a.match(/a/)) 只要字符串包含a就能pass

那么,如果我想字符串匹配包含引号怎么办?像这样 a

简单,用正斜杠包起来

if(a.match(/"a"/))

这样就需要有引号才能pass通过了

还有一种是用转义符\ 即反斜杠,C语言见过的

if(a.match("\"a\""))

如果要匹配括号呢

如果是匹配单个括号,用引号

if(a.match(")")) if(a.match("(")) 都错误,因为一段代码出现了单数的括号

if(a.match(/)/)) if(a.match(/(/)) 也一样

我先说引号

如果要匹配单个括号

if(a.match("\\("))

\\表示一个转义符\ 然后\( 这才开始转义 表示(

首先声明一下,在引号里转义符不能单独存在

if(a.match("\")) 这样是不行的

为什么这样说呢,因为在引号里,两个\\才代表一个转义符\,这里\\并不是转义成\

那这样行不行 if(a.match("\\")) ,总不是单独了吧 NO,\\表示\ 还是不行

if(a.match( \\\ )) 三个呢? \\表示\ 有一个转义符了,但要转义成\号还缺少一个

if(a.match( \\\\ ))这样就行了,\\两个转义符在一起就转义成了普通的反斜杠\号,所以这个可以匹配包含\号的字符串

如果要匹配两个\\ 则if(a.match( \\\\\\\\ )) 八个

后面的依此类推

现在说// 正斜杠

如果要匹配单个括号

这样就ok if(a.match(/\(/)) 发现没,一个转义符就够了

if(a.match("\\(")) 其实也是一个转义符,就是给你个错觉觉得是两个,在说一次,在引号里,两个\\才代表一个转义符

如果要匹配一个反斜杠\号

if(a.match(/\\/))

两个则if(a.match(/\\\\/))

关于转义符,大家最好看看百度百科,查查资料

正则表达式玩的就是转义符,这个必须理解

我承认这让人头晕。。。。

更正一下,转义符\在引号里有个特殊情况不需要两个\\,那就是转义引号可以只有一个\,例如a.match("\""),a.match("\"a\""),还有a.match("\(\)")跟a.match("()")一样,就这两种特殊情况,注意一下

需要转义的符号一般也就括号,引号,斜杠号

如果包含成双的,会怎样

if(a.match("()")) 包含双括号,表示什么也没有,什么都能匹配

if(a.match("""")) 错误

if(a.match(/()/)) 包含双括号,表示什么也没有,什么都能匹配

if(a.match(/""/)) 不会错误,表示什么也没有,什么都能匹配

现在说说 "" 和// 包含普通符号会怎样

先说引号

if(a.match("//")) 它是可以包含正斜杠的,而且是有几个就匹配几个,别看成转义符了哈

if(a.match("!"))

if(a.match("@"))

if(a.match("%"))

等,都能包含匹配,除了正则表达式的特殊符号,比如^ * ? 等,要不就是错误要不就是任何都能匹配,大家可以试试

再说正斜杠

if(a.match(///)) 错误的

其他包含普通字符大致上跟引号包含差不多

如果在引号内 要匹配引号就需要转义引号。在//内就不需要 如果在//内,要匹配/号就需要转义/号,在 内就不需要

if(a.match(/""/)) 不会错误,表示什么也没有,什么都能匹配 这句话错误,这里更改为 if(a.match(/""/)) 能匹配 sorry

下面再来一个

只要字符串数字就通过

这样if(a.match(/\d/)) 如果用引号if(a.match( \\d )) 还记得引号里面两个\\代表一个转义符吧

d表示数字这个我们见过了,C语言有个%d

只要包含数字就通过,a123,123abc也通过

正反斜杠有点晕了吧

先看看下面

正则表达式由一些普通字符和一些元字符(metacharacters)组成。普通字符包括大小写的字母和数字,而元字符则具有特殊的含义,我们下面会给予解释。在最简单的情况下,一个正则表达式看上去就是一个普通的查找串。例如,正则表达式"testing"中没有包含任何元字符,它可以匹配"testing"和"123testing"等字符串,但是不能匹配"Testing"。 要想真正的用好正则表达式,正确的理解元字符是最重要的事情。元字符就是以反斜杠\开头的,表示特殊含义的字符,比如\d 就表示数字,出现这种类型的字符就需要用转义符

如果下面的你能看明白了,说明正则表达式第一难点正反斜杠这一道坎你过去了

如果要匹配/d 就这样两个字符

需要这样if(a.match("/\d"))

如果/d/ 就这样3个字符

需要这样if(a.match("/\d/")) 不要引号就是匹配数字

如果/d// 4个字符

需要这样if(a.match("\/d//"))

如果//d// 5个字符

需要这样if(a.match("\//d//"))

如果 1//,123// 这类

需要这样 if(a.match(" \\d// "))

如果//1,//123这类

需要这样 if(a.match("//\\d"))

前面说了,转义符\不能在引号单独存在,就是说不能全部转义成反斜杠的转义符,无论它有几个,只要留下一个未转义的转义符,就不能匹配,这点其实正斜杠包含也一样的

这种情况只存在括号内只有它们

但看上面,括号引号内有单独的转义符,还有其他东西例如d,这种情况是可以匹配的

但是转义符如果不能转义,也就是说它在里面发挥不了作用,你就可以当它不存在了,不用去匹配它,它只是个打酱油的

看上面第一个if(a.match("/\d")) 它在里面没法转义,你就可以看成

if(a.match("/d")) 引号是可以包含正斜杠的哈,这点不需要去转义正斜杠符号

而如果这样if(a.match("/\\d")) 它发挥了作用,这样就能匹配/123,/111这样的了

如果用正斜杠包含就需要这样if(a.match(/\/\d/))

看if(a.match("\a"))能匹配什么 转义符不能发挥作用,就可以无视他

其实就是简单的if(a.match("a")) 而已

需要 if(a.match(" \\\\a ")) 这样才能匹配\a

但是凡事也有例外, if(a.match("\5")) 能匹配5吗

你会发现什么也匹配不了,因为一个反斜杠后面跟着数字就变成了另外一个东西

大家可以直接打印看看会是什么

<input id="a" type="text" />

<input type="button" onclick='regexp(document.getElementById("a").value)' value="Test"/>

<input type="button" onclick='print()' value="print"/> <script>

function regexp(a)

{

if(a.match("\5"))

alert("Pass");

else

alert("No Pass"); }

function print()

{

alert("\5")

}

</script>

但是例外中还有例外,if(a.match("\65"))和if(a.match("\88"))能匹配65和88

就是

function print()

{

alert("\n") //n这个数你自己定

}

只要能打印弹出正整数,就能匹配n,不信大家可以试试

暂且还不知道用的是什么表

但可以肯定的是,如果数字是3位数(这3位数要是八进制里的),就会打印出asc码数字八进制对应的字符

比如 if(a.match("\101")) 在asc码表里对应A,所以能够匹配A

这个不需要研究太深,你只要知道在转义符后面不要跟上数字就行了!

还有,在上面的题目中,我故意加了些没用的斜杠号在里面,因为在以后看别人写的正则表达式难免也会这样,你要能分辨出来

如果你看到这里之前就已经分辨出来了,那么,恭喜你,正则表达式的正反斜杠对你已经不难了,我们可以进入下一个阶段了

下面的我就不再用引号 了

先看看怎么只让数字不匹配,很简单

if(a.match(/\D/)) \D能让非数字不匹配,只要字符串不包含数字就ok

那么,我要只匹配字母怎么办,用[]

if(a.match(/[a-z]/)) 表示只匹配a到z的小写字母,按asc表顺序

if(a.match(/[A-Z]/)) 表示只匹配A到Z的大写字母

想大小写一起匹配就这样

if(a.match(/[a-zA-Z]/)) 顺序换一下也可以 if(a.match(/[A-Za-z]/))

但是不能这样 if(a.match(/[a-z][A-Z]/))

只匹配数字 if(a.match(/[0-9]/)) 和\d一个效果

只不匹配数字呢 用^符号 在[]里表示非的意思

if(a.match(/[^0-9]/)) 和\D一个效果

匹配包括下划线的任何单词字符?用/w

if(a.match(/\w/)) 相当于 if(a.match(/[A-Za-z0-9_]/))

if(a.match(/\W/)) 则相当于 if(a.match(/[^A-Za-z0-9_]/)) 空格可匹配

像\d \w这类的正则表达式还有很多,就不一一说了,都很简单的