• 2009-08-18

    浅谈as中正则表达式

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://wxsr.blogbus.com/logs/44513506.html

    可能大家对正则表达式会感到很陌生,或者有点印象的人会觉得它很晦涩难懂。虽然在我们看起来正则表达式确实很晦涩难懂。但如果熟悉后,其实你会发现 正则表达式是一种简单而功能强大的标准。

    正则表达式的用于查找和处理字符串中的匹配文本的模式。它能用很简短的语句来完成一项复杂繁琐的字符串查找替换匹配处理。

    好了下边详细说说在as3中正则表达式。

    在ActionScript 3.0 按照 ECMAScript 第 3 版语言规范 (ECMA-262) 中的定义实现正则表达式。

    在这先看看一般用于匹配邮箱地址匹配的正则表达式:

    /([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}/
    先别被吓着,但你懂得了正则表达式后要理解上边的例子并不困难。后边在讲述了正则表达式的基本语法后再回过头来跟大家说说这个正则表达式的。


    在正则表达式中我们用两条斜杠“/”来界定一个正则表达式,这个界定就跟一个functrion 的一对大括号一样"{", "}"
    他们界定了一句正则表达式的有效范围
    如:/ABC/
    这是一句简单的正则达式,如果我们用这个正则表达式来匹配一串字符串的话,它意义就相当于给你检查这句字符串里有没有“ABC”这个字符串.

    在正则表达式的语法中 字符基本分为”字符“,”元字符“,‘元序列’
    元字符:就是一些具有特殊意义的字符如下:

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

    这些字符是保留的他们就跟关键字一样有特殊的意义。我们把他们成为元字符.

    一个带凡斜杠“\”的字符在正则表达式里叫转义符。他们具有特殊的意义。
    元序列:是在正则表达式模式中具有特殊含义的字符序列

    元字符一样他们都是有特殊意义的字符转。而已一般的元序列都是由“\”加字符串的形式组成。
    像 :指标符\t,回车符 \r 换行符\n 等。。。当然并非全部都是以凡斜杠 "\"加字符这样的转义符形式。它可能是一些带式数量的数量表示符
    像{n},{n,},{n,m} 这样的形式存在。


    字符、元字符和元序列

    关于元字符

    下表总结了可以在正则表达式中使用的元字符:

    元字符

    描述

    ^(尖号)

    匹配字符串的开头。设置 m (multiline) 标志后,尖号还匹配行的开头(请参阅m (multiline) 标志)。请注意,尖号用在字符类的开头时表示符号反转而非字符串的开头。有关详细信息,请参阅字符类

    $(美元符号)

    匹配字符串的结尾。设置 m (multiline) 标志后,$ 还匹配换行 (\n) 字符前面的位置。有关详细信息,请参阅m (multiline) 标志

    \(反斜杠)

    对特殊字符的特殊元字符含义进行转义。
    此外,如果要在正则表达式文本中使用正斜杠字符,也要使用反斜杠字符,例如,/1\/2/ 匹配字符 1 后跟正斜杠字符和字符 2。

    .(点)

    匹配任意单个字符。

    只有设置 s (dotall) 标志时,点才匹配换行字符 (\n)。有关详细信息,请参阅s (dotall) 标志

    *(星号)

    匹配前面重复零次或多次的项目。

    有关详细信息,请参阅数量表示符

    +(加号)

    匹配前面重复一次或多次的项目。

    有关详细信息,请参阅数量表示符

    ?(问号)

    匹配前面重复零次或一次的项目。

    有关详细信息,请参阅数量表示符

    ()

    在正则表达式中定义组。以下情况下使用组:

    • 限制逻辑"或"字符 | 的范围:/(a|b|c)d/
    • 定义数量表示符的范围:/(walla.){1,2}/
    • 用在逆向引用中。例如,下面的正则表达式中的 \1 匹配模式的第一个括号组中的匹配内容:
      /(\w*) is repeated: \1/

    有关详细信息,请参阅

    []

    定义字符类,字符类定义单个字符可能的匹配:

    /[aeiou]/ 匹配所指定字符中的任意一个。

    在字符类中,使用连字符 (-) 指定字符的范围:

    /[A-Z0-9]/ 匹配从 A 到 Z 的大写字母或 0 到 9 的数字。

    在字符类中,插入反斜杠对 ] 和
    - 字符进行转义:

    /[+\-]\d+/ 匹配一个或多个数字前面的 +-

    在字符类中,以下字符(通常为元字符)被看作一般字符(非元字符),不需要反斜杠:

    /[$£]/ 匹配 $

    有关详细信息,请参阅字符类

    |(竖线)

    用于逻辑"或"操作,匹配左侧或右侧的部分:

    /abc|xyz/ 匹配 abcxyz



    字符、元字符和元序列

    关于元序列

    元序列是在正则表达式模式中具有特殊含义的字符序列。下表说明了这些元序列:

    元序列

    描述

    {n}

    {n,}

    {n,n}

    指定前一项目的数值数量或数量范围:

    /A{27}/ 匹配重复 27 次的字符 A

    /A{3,}/ 匹配重复 3 次或更多次的字符 A

    /A{3,5}/ 匹配重复 35 次的字符 A

    有关详细信息,请参阅数量表示符

    \b

    匹配单词字符和非单词字符之间的位置。如果字符串中的第一个或最后一个字符是单词字符,则也匹配字符串的开头或结尾。

    \B

    匹配两个单词字符之间的位置。也匹配两个非单词字符之间的位置。

    \d

    匹配十进制数字。

    \D

    匹配除数字以外的任何字符。

    \f

    匹配换页符。

    \n

    匹配换行符。

    \r

    匹配回车符。

    \s

    匹配任何空白字符(空格、制表符、换行符或回车符)。

    \S

    匹配除空白字符以外的任何字符。

    \t

    匹配制表符。

    \unnnn

    匹配字符代码由十六进制数字 nnnn 指定的 Unicode 字符。例如,\u263a 是一个笑脸字符。

    \v

    匹配垂直换页符。

    \w

    匹配单词字符(A-Za-z0-9_)。请注意,\w 不匹配非英文字符,如 eOA

    \W

    匹配除单词字符以外的任何字符。

    \xnn

    匹配具有指定 ASCII 值(由十六进制数字 nn 定义)的字符。


    再来我们说说正则表达式中的另外几种字符

    字符类数量表示符逻辑符”或

    字符类:

    字符类里包含了3个跟元字符一样功能的字符

    ]  -  \

    字符类

    元字符

    在字符类中的含义

    ]

    定义字符类的结尾。

    -

    定义字符范围(请参阅字符类中字符的范围)。

    \

    定义元序列并撤销元字符的特殊含义。

    字符类

    除能够保持特殊含义的元字符外,下列元序列在字符类中也具有元序列功能:

    元序列

    在字符类中的含义

    \n

    匹配换行符。

    \r

    匹配回车符。

    \t

    匹配制表符。

    \unnnn

    匹配具有指定 Unicode 代码点值(由十六进制数字 nnnn 定义)的字符。

    \xnn

    匹配具有指定 ASCII 值(由十六进制数字 nn 定义)的字符。

    其它正则表达式元序列和元字符在字符类中看作普通字符。

    在字符类中我们可以用于对中括号来表示一个字符的范围

    /[a-z0-9]/

    这句正则表达式的意思就是匹配一个或多个由小写字母或者数字组成的字符或字符串

    像 "a"   "abcd""   "a1v2" 都能匹配这句正则表达式。

    但像“_a"  ''!a1234" "&Dda2"这几个字符则不能匹配刚才的正则表达式。

    而字符”^“在一个字符类的前面时他的意思是取反的意思,像/[^a-z0-9]/的意思就是匹配一个或多个小写字母或者数字组成的字符或字符串意外的任何字符。

     

    但要注意的是如果^在一个字符类范围的后边的话,它只表示尖括号字符而没有取反的意义。

    像/[#$%&^]/

    在这再说说 字符类的范围 [  ]在一对中括号内的字符类匹配当中的一个或多个当中出现的字符而不表示一个字符串。

    也就是说[abc]并不表示字符串“abc”它匹配只要出现当中的任意一个字符组合的形式,

    在正则表达式里要表示一个字符串或者单词类的由多个字符组成的字符类我们一般用 组()括起来表示

    像(abc)它就匹配a后边必须是b而b你必须是c否则都不匹配。

     

    下边说说数量表示符

    使用数量表示符指定字符或序列在模式中的重复次数

    数量表示符

    数量表示符元字符

    描述

    *(星号)

    匹配前面重复零次或多次的项目。

    +(加号)

    匹配前面重复一次或多次的项目。

    ?(问号)

    匹配前面重复零次或一次的项目。

    {n}

    {n,}

    {n,n}

    指定前一项目的数值数量或数量范围:

    /A{27}/ 匹配重复 27 次的字符 A。

    /A{3,}/ 匹配重复 3 次或更多次的字符 A。

    /A{3,5}/ 匹配重复 3 到 5 次的字符 A。

    您可以将数量表示符应用到单个字符、字符类或组:

    • /a+/ 匹配重复一次或多次的字符 a
    • /\d+/ 匹配一个或多个数字。
    • /[abc]+/ 匹配重复的一个或多个字符,这些字符可能是 abc 中的某个。
    • /(very, )*/ 匹配重复零次或多次的后跟逗号和空格的单词 very

     

     

    逻辑"或"

    逻辑"或"

    在正则表达式中使用 |(竖线)字符可使正则表达式引擎考虑其它匹配。例如,下面的正则表达式匹配单词 cat、dog、pig 和 rat 中的任意一个:

    var pattern:RegExp = /cat|dog|pig|rat/;
    

    您可以使用括号定义组以限制逻辑"或"字符 | 的范围。下面的正则表达式匹配 cat 后跟 napnip

    var pattern:RegExp = /cat(nap|nip)/;
    

     

    您可以使用括号在正则表达式中指定组,如下所示:

    /class-(\d*)/
    
    之前在字符类那里已经提到过了。下边再 说说

    组是模式的子部分。您可以使用组实现以下操作:

    • 将数量表示符应用到多个字符。
    • 界定要应用逻辑"或"(通过使用 | 字符)的子模式。
    • 捕获正则表达式中的子字符串匹配(例如,在正则表达式中使用 \1 以匹配先前匹配的组,或类似地在 String 类的 replace() 方法中使用 $1)。

    标志和属性
    最后说的是

    标志和属性

    下表列出了可以为正则表达式设置的五种标志。每种标志都可以作为正则表达式对象属性进行访问。

    标志

    属性

    描述

    g

    global

    匹配多个匹配。

    i

    ignoreCase

    不区分大小写的匹配。应用于 A-Za-z 字符,但不能应用于扩展字符,如 Ee

    m

    multiline

    设置此标志后,$^ 可以分别匹配行的开头和结尾。

    s

    dotall

    设置此标志后,.(点)可以匹配换行符 (\n)。

    x

    extended

    允许扩展的正则表达式。您可以在正则表达式中键入空格,它将作为模式的一部分被忽略。这可使您更加清晰可读地键入正则表达式代码。

    请注意这些属性都是只读属性。您在设置正则表达式变量时,可以设置标志(gimsx),如下所示:

    var re:RegExp = /abc/gimsx;
    

    但是,您无法直接设置命名属性。例如,下列代码将导致错误:

    var re:RegExp = /abc/;
    re.global = true; // 这会产生错误。
    


    好了了解了上边的基础内容后,我们举几个例子来深入学习下

    想一开始提出的一个匹配邮箱地址的正则表达式:
    /([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}/
    现在看起来是不是已经比较简单明白了呢?
    先看第一段
    ([0-9a-zA-Z]+[-._+&])
    它表示一个组而这个组里边前边必须由一个多则多个以数字或者字母组成,而后边必须带是 -._+&这5个字符中的任意一个。

    而在组的后边用了数量表示符*
    ([0-9a-zA-Z]+[-._+&])*
    到这,这一句就是
    它表示一个组而这个组里边前边必须由一个多则多个以数字或者字母组成,而后边必须带是 -._+&这5个字符中的任意一个。这个组的0个或者多个这样的组合
    ([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@
    而这样的组合之后必须带一个或多个由字符或者数字组成的字符,然后或边必须跟一个@字符
    ([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}
    这句的意思就是 一个或多个有字符或数字组成的字符类之后再带一个字符"."最后必须带一个有2-6个字母组成的字符串



    其实上边我说的这些大家可以在flash cs3-4的自带帮助里有跟详细的说明。
    好了先写到这。这些入门后以后还会在出相关的正则表示式的具体实例。

    收藏到:Del.icio.us