首页 > JavaScript > JavaScript 正则表达式 选择、分组和引用
2009八月4

JavaScript 正则表达式 选择、分组和引用

前面的日志,在介绍正则表达式的字符类时曾经说过,JavaScript的正则表达式支持布尔操作,除了作为 选择的“布尔或”操作之外,正则表达式还支持分组和引用。其实选择、分组和引用的作用分别为:指定选择项、对子表达式分组和引用 前一子表达式的特殊字符。

正则表达式的选择:

所谓选择即在多个条件里面选择一个,比如说卖水果的大爷说送你个水果,你可以选择“梨”,“苹果”,“西瓜”中的任何一个。当然你会选择西瓜,呵呵。

字符”|”用于分隔供选择的字符,例如/西瓜|梨|苹果/匹配的是“西瓜”,“梨”,或者是“苹果”。同样我要是想根据昨天讲过的字符类去匹配一些规则,比如我想匹配3个数字,或者是4个小写字母就可以用模式/\d{3}|[a-z]{4}/,呵呵,咋样?即了解了选择,又用上了字符类,同时呢我们还用到了重复,这几天讲的东西都复习了一遍,哈哈。

选择项是从左到右考虑,直到发现了匹配项。如果左边的选择项匹配,则忽略右边的匹配项,即使它产生更好的匹配。

其实上面的话是很好理解的,还是拿大爷送你水果的例子,大爷第一次拿出西瓜,问你要不要?如果你选择了西瓜,大爷自然不会再问你要不要苹果或者梨了。而如果你不要西瓜,那么大爷会再拿出个梨,问你要不要?就是这个道理。

正则表达式的分组:

我们可以通过使用小括号来对正则表达式进行分组。所谓分组,其实可以理解为合作伙伴,且是无商业利益的,合作伙伴之间的关系是一荣俱荣,一损俱损。也就是说把括号内的东西当成一个小组,一个单元。分组就就是正则表达式中的子表达式,这个我们下面的引用会讲到。

一个单元就说明后面的重复规则,与前后小组间的“或”关系,都是以小组为单位的。小组里的东西是统一处理的。

//如下模式即可以匹配java,也可以匹配javascript
//因为?表示的是出现0次或1次,如果一次不出现那么就匹配的是java
//否则匹配的就是javascript
var pattern = /java(script)?/;

//下面代码返回的是abcdcd,cd,ef,,efnull
var patt1=new RegExp("(ab|cd)+|(ef)","g");

do
{
result=patt1.exec("abcdcdef");
document.write(result);
}
while (result!=null)

在JavaScript1.5中,无须创建带编码的引用就可以将正则表达式中的项目进行组合。它不是以括号对项目进行分组,而是以”(?:”和”)”进行的分组,不过此分组不能生成引用(下面介绍的就是引用)。

正则表达式的引用:

在正则表达式中,其实括号的另一个作用是在完整的模式中定义子模式。当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和括号中的子模式相匹配的部分。

例如:我想要检索的条件是3个字母加上4个数字,但是真正对我有用的是那4个数字。则可以使用如下模式进行匹配

//3个字母加4个数字的匹配模式
var pattern = /[a-z]{3}\d{4}/;

但是我咋能选择匹配我的这个模式的字符串中的数字部分呢?这是一个问题。(呃,在这里强调一下,怎么找出符合这个模式的字符串不属于本篇日志内容。这里还是先继续挖坑。嗯。)这时候我们就需要把那个数字部分也变成分组,既然是分组,那么我们就可以给组一个编号嘛。呵呵。

//3个字母加4个数字的匹配模式
var pattern = /[a-z]{3}(\d{4})/;

带括号的子表达 式的另一个用途是允许我们在同一正则表达式的后部引用前面的子表达式(可下引出正题来了)。这是通过在字符”\”后加一位或多位数字实现的。例如,\1引用 提第一个带括号的子表达式,\3则表示引用的是第三个带括号的子表达式。

由于 子表达式可以被嵌套在别的子表达式中,所以它的位置是被计数的左括号的位置。

//下例中的([Ss]cript)就被指定为\2
var pattern = /([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/;

对正则表达式中前一子表达式的引用 所指的并不是那个子表达式的模式,而是与那个模式相匹配的文本,这个是一定不要弄混的。因为你想,你真正关心的也不是模式,模式只是找出你想要的东西的一个工具而已。

根据上面的规定,我就可以实证 条约束,即一个字符串各个单独的部分包含的是完全相同的字符。例如,我下面的正则表达式匹配的就是位于单引号或者双引号之内的0个或多个字符。如果我想要前后引号是匹配的(都是单引号或都是双引号)就可以用上引用。

//不会管前后引号是否相同 下面代码输出true
var pattern = /["'][^"']*["']/;
document.write(pattern .test("The 'best\" things in life are free"));

//保证前后引号相同 下面代码输出true,false
var pattern = /(["'])[^"']*\1/;

document.write(pattern.test("The 'best' things in life are free"));
document.write(pattern.test("The 'best\" things in life are free"));

正则表达式的选择、分组和引用运算符:

字符 含义
| 选择。匹配的是该符号左边的子表达式或右边的子表达式,其实就是布尔“或”
(…) 组合。将几个项目组合为一个单元,这个单元可由*、+、?和|等符号使用,而且 还可以记住和这个组合匹配的字符以供此后的引用使用
(?:…) JavaScript 1.5中可以使用其对正则表达式进行分组,但是只是分组。把项目组合到一个单元,但是不记忆与该组匹配的字符
\n 和第n个分组第一次匹配的字符相匹配。组是括号 中的子表达式(可嵌套,以左半括号开始数,从1开始数,一到数下去 ),以(?:…)分组的组不进行编码

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/08/04/1306/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

15 Responses to “JavaScript 正则表达式 选择、分组和引用”

  1. #1 LAONB 回复 | 引用 Post:2009-08-05 00:16

    FUNCTION看来是用来调用的。VAR跟他类似吧。
    看来这类东西真的是要实践,要不然连改都困难,就像我改CSS过程中,学到东西一样。 :arrow:

    [回复]

  2. #2 阿东 回复 | 引用 Post:2009-08-05 08:09

    如果以后要学JAVE的话。 。一定来翻你的老底。 。。

    [回复]

  3. #3 simaopig 回复 | 引用 Post:2009-08-05 08:25

    @阿东
    の,JAVA我都忘没了。。学PHP过来吧,一起。呵呵。

    [回复]

  4. #4 simaopig 回复 | 引用 Post:2009-08-05 08:26

    @LAONB
    是的,不动手啥都忘没了。呵呵。

    [回复]

  5. #5 hslx111 回复 | 引用 Post:2009-08-05 09:14

    这个写全了是不是可以出书了…..

    [回复]

  6. #6 吖Bee 回复 | 引用 Post:2009-08-05 09:54

    这个可以学学…

    [回复]

  7. #7 bolo 回复 | 引用 Post:2009-08-05 13:42

    正则的确很复杂,改起来烦,写更烦

    [回复]

  8. #8 JiaCheng 回复 | 引用 Post:2009-08-05 21:37

    怎么还在画天书?

    [回复]

  9. #9 beetea 回复 | 引用 Post:2009-08-06 12:13

    我的blog没hack了,欢迎大家前来围观,免收门票

    [回复]

  10. #10 simaopig 回复 | 引用 Post:2009-08-06 15:24

    @hslx111
    这个是在抄书,呵呵。。大部分都是书上有的内容,我写一下就当自己练习了一下,基因一下记忆。

    [回复]

  11. #11 simaopig 回复 | 引用 Post:2009-08-06 15:24

    @吖Bee
    如果觉得有用的话可以了解一下。呵。

    [回复]

  12. #12 simaopig 回复 | 引用 Post:2009-08-06 15:25

    @bolo
    嗯。改的时候一定要很小心才行。

    [回复]

  13. #13 simaopig 回复 | 引用 Post:2009-08-06 15:26

    @JiaCheng
    呃。还要画一阵子。呵。

    [回复]

  14. #14 simaopig 回复 | 引用 Post:2009-08-06 15:27

    @beetea
    恭喜,恭喜。呵呵。

    [回复]

  15. #15 afc163 回复 | 引用 Post:2010-03-18 17:10

    很详细,收藏了!

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)