国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > web前端 > htmlcss > [JavaScript] 11.JS 偶识【正则表达式】[2]

[JavaScript] 11.JS 偶识【正则表达式】[2]

来源:程序员人生   发布时间:2016-06-20 08:05:30 阅读次数:3943次

本博文续写自:[JAVA · 低级]:24.偶识【正则表达式】[1]

构造

构造正则表达式的方法和创建数学表达式的方法1样。也就是用多种元字符与操作符将小的表达式结合在1起来创建更大的表达式。

可以通过在1对分隔符之间放入表达式模式的各种组件来构造1个正则表达式。对 JScript 而言,分隔符为1对正斜杠 (/) 字符。例如:

/expression/

对 VBScript 而言,则采取1对引号 ("") 来肯定正则表达式的边界。例如:

"expression"

在上面所示的两个示例中,正则表达式模式 (expression) 均存储在RegExp 对象的Pattern 属性中。

正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或所有这些组件的任意组合。


优先权顺序

在构造正则表达式以后,就能够象数学表达式1样来求值,也就是说,可以从左至右并依照1个优先权顺序来求值。

下表从最高优先级到最低优先级列出各种正则表达式操作符的优先权顺序:

操作符

描写

\

转义符

(), (?:), (?=), []

圆括号和方括号

*, +, ?, {n}, {n,}, {n,m}

限定符

^, $, \anymetacharacter

位置温柔序

|

“或”操作

 

普通字符

普通字符由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号和1些符号。

最简单的正则表达式是1个单独的普通字符,可以匹配所搜索字符串中的该字符本身。例如,单字符模式 'A' 可以匹配所搜索字符串中任何位置出现的字母 'A'。这里有1些单字符正则表达式模式的示例:

/a/

/7/

/M/

等价的 VBScript 单字符正则表达式为:

"a"

"7"

"M"

可以将多个单字符组合在1起得到1个较大的表达式。例如,下面的 JScript 正则表达式不是别的,就是通过组合单字符表达式 'a'、'7'和 'M' 所创建出来的1个表达式。

/a7M/

等价的 VBScript 表达式为:

"a7M"

请注意这里没有连接操作符。所需要做的就是将1个字符放在了另外一个字符后面。

 

特殊字符

有很多元字符在试图对其进行匹配时需要进行特殊的处理。要匹配这些特殊字符,必须首先将这些字符转义,也就是在前面使用1个反斜杠 (\)。下表给出了这些特殊字符及其含义:

特殊字符

说明

$

匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。

( )

标记1个子表达式的开始和结束位置。子表达式可以获得供以后使用。要匹配这些字符,请使用 \( 和 \)。

*

匹配前面的子表达式零次或屡次。要匹配 * 字符,请使用 \*。

+

匹配前面的子表达式1次或屡次。要匹配 + 字符,请使用 \+。

.

匹配除换行符 \n以外的任何单字符。要匹配 .,请使用 \。

[

标记1个中括号表达式的开始。要匹配 [,请使用 \[。

?

匹配前面的子表达式零次或1次,或指明1个非贪婪限定符。要匹配 ? 字符,请使用 \?。

\

将下1个字符标记为或特殊字符、或原义字符、或后向援用、或8进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。

^

匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。

{

标记限定符表达式的开始。要匹配 {,请使用 \{。

|

指明两项之间的1个选择。要匹配 |,请使用 \|。

 

非打印字符

有很多很有用的非打印字符,偶尔必须使用。下表显示了用来表示这些非打印字符的转义序列:

字符

含义

\cx

匹配由x指明的控制字符。例如, \cM 匹配1个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之1。否则,将 c 视为1个原义的 'c' 字符。

\f

匹配1个换页符。等价于 \x0c 和 \cL。

\n

匹配1个换行符。等价于 \x0a 和 \cJ。

\r

匹配1个回车符。等价于 \x0d 和 \cM。

\s

匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

\S

匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t

匹配1个制表符。等价于 \x09 和 \cI。

\v

匹配1个垂直制表符。等价于 \x0b 和 \cK。

 

字符匹配

句点 (.) 匹配1个字符串中任何单个的打印或非打印字符,除换行符 (\n) 以外。下面的 JScript 正则表达式可以匹配 'aac'、'abc'、'acc'、'adc'如此等等,一样也能够匹配 'a1c'、'a2c'、a-c'和 a#c':

/a.c/

等价的 VBScript 正则表达式为:

"a.c"

如果试图匹配1个包括文件名的字符串,其中句点 (.) 是输入字符串的1部份,则可以在正则表达式中的句点前面加上1个反斜杠 (\) 字符来实现这1要求。举例来讲,下面的 JScript 正则表达式就可以匹配 'filename.ext':

/filename\.ext/

对 VBScript 而言,等价的表达式以下所示:

"filename\.ext"

这些表达式依然是相当有限的。它们只允许匹配任何单字符。很多情况下,对从列表中匹配特殊字符10分有用。例如,如果输入文字中包括用数字表示为Chapter 1, Chapter 2诸如此类的章节标题,你可能需要找到这些章节标题。

括号表达式

可以在1个方括号 ([ 和 ]) 中放入1个或多个单字符,来创建1个待匹配的列表。如果字符被放入括号中括起来,则该列表称为括号表达式。括号内和其他任何地方1样,普通字符代表其本身,也就是说,它们匹配输入文字中出现的1处自己。大多数特殊字符在位于括号表达式中时都将失去其含义。这里有1些例外:

']' 字符如果不是第1项,则将结束1个列表。要在列表中匹配 ']' 字符,请将其放在第1项,紧跟在开始的 '[' 后面。

'\' 依然作为转义符。要匹配 '\' 字符,请使用 '\\'。

括号表达式中所包括的字符只匹配该括号表达式在正则表达式中所处位置的1个单字符。下面的 JScript 正则表达式可以匹配 'Chapter 1'、'Chapter 2'、'Chapter 3'、'Chapter 4' 和 'Chapter 5':

/Chapter[12345]/

在 VBScript 中要匹配一样的章节标题,请使用下面的表达式:

"Chapter[12345]"

请注意单词 'Chapter' 及后面的空格与括号内的字符的位置关系是固定的。因此,括号表达式只用来指定满足紧跟在单词 'Chapter' 和1个空格以后的单字符位置的字符集合。这里是第9个字符位置。

如果希望使用范围而不是字符本身来表示待匹配的字符,则可使用连字符将该范围的开始和结束字符分开。每一个字符的字符值将决定其在1个范围内的相对顺序。下面的 JScript 正则表达式包括了1个等价于上面所示的括号列表的范围表达式。

/Chapter[1⑸]/

VBScipt 中相同功能的表达式以下所示:

"Chapter[1⑸]"

如果以这类方式指定范围,则开始和结束值都包括在该范围内。有1点特别需要注意的是,在 Unicode 排序中起始值1定要在结束值之前。

如果想在括号表达式中包括连字符,则必须使用下述方法之1:

使用反斜杠将其转义:

[\-]

将连字符放在括号列表的开始和结束位置。下面的表达式能匹配所有的小写字母和连字符:

[-a-z]

[a-z-]

创建1个范围,其中开始字符的值小于连字符,而结束字符的值等于或大于连字符。下面两个正则表达式都满足这1要求:

[!--]

[!-~]

一样,通过在列表开始处放置1个插入符(^),就能够查找所有不在列表或范围中的字符。如果该插入符出现在列表的其他位置,则匹配其本身,没有任何特殊含义。下面的 JScript 正则表达式匹配章节号大于 5 的章节标题:

/Chapter[^12345]/

对 VBScript 则使用:

"Chapter[^12345]"

在上面所示的示例中,表达式将匹配第9个位置处除1, 2, 3, 4, or 5 以外的任何数字字符。因此, 'Chapter 7' 为1个匹配,一样 'Chapter 9' 也是如此。

上面的表达式可使用连字符 (-) 表示。对 JScript 为:

/Chapter[^1⑸]/

或,对 VBScript 为:

"Chapter[^1⑸]"

括号表达式的典型用法是指定对任何大写或小写字母字符或任何数字的匹配。下面的 JScript 表达式给出了这1匹配:

/[A-Za-z0⑼]/

等价的 VBScript 表达式为:

"[A-Za-z0⑼]"

 

限定符

有时候不知道要匹配多少字符。为了能适应这类不肯定性,正则表达式支持限定符的概念。这些限定符可以指定正则表达式的1个给定组件必须要出现多少次才能满足匹配。

下表给出了各种限定符及其含义的说明:

字符

描写

*

匹配前面的子表达式零次或屡次。例如,zo* 能匹配 "z" 和 "zoo"。 * 等价于{0,}。

+

匹配前面的子表达式1次或屡次。例如,'zo+' 能匹配 "zo" 和 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

?

匹配前面的子表达式零次或1次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。

{n}

n 是1个非负整数。匹配肯定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

{n,}

n 是1个非负整数。最少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

{n,m}

m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, "o{1,3}" 将匹配 "fooooood" 中的前3个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

对1个很大的输入文档而言,章节数很轻易就超过9章,因此需要有1种方法来处理两位数或3位数的章节号。限定符就提供了这个功能。下面的JScript 正则表达式可以匹配具有任何位数的章节标题:

/Chapter[1⑼][0⑼]*/

下面的 VBScript 正则表达式履行一样的匹配:

"Chapter[1⑼][0⑼]*"

请注意限定符出现在范围表达式以后。因此,它将利用于所包括的全部范围表达式,在本例中,只指定了从 0 到 9 的数字。

这里没有使用 '+' 限定符,由于第2位或后续位置上其实不1定需要1个数字。一样也没有使用 '?' 字符,由于这将把章节数限制为只有两位数字。在 'Chapter' 和空格字符以后最少要匹配1个数字。

如果已知章节数限制只有99 章,则可使用下面的 JScript 表达式来指定最少有1位数字,但不超过两个数字。

/Chapter[0⑼]{1,2}/

对 VBScript 可使用下述正则表达式:

"Chapter[0⑼]{1,2}"

上述表达式的缺点是如果有1个章节号大于 99,它仍只会匹配前两位数字。另外一个缺点是某些人可以创建1个 Chapter 0,而且仍能匹配。1个更好的用来匹配两位数的 JScript 表达式以下:

/Chapter[1⑼][0⑼]?/

/Chapter[1⑼][0⑼]{0,1}/

对 VBScript 而言,下述表达式与上面等价:

"Chapter[1⑼][0⑼]?"

"Chapter[1⑼][0⑼]{0,1}"

'*'、 '+'和 '?' 限定符都称之为贪婪的,也就是说,他们尽量多地匹配文字。有时这根本就不是所希望产生的情况。有时则正好希望最小匹配。

例如,你可能要搜索1个 HTML 文档来查找1处包括在 H1 标记中的章节标题。在文档中该文字可能具有以下情势:

<H1>Chapter1 – Introduction to Regular Expressions</H1>

下面的表达式匹配从开始的小于号 (<) 到 H1 标记结束处的大于号之间的所有内容。

/<.*>/

 VBScript 的正则表达式为:

"<.*>"

如果所要匹配的就是开始的 H1 标记,则下述非贪婪地表达式就只匹配 <H1>。

/<.*?>/

"<.*?>"

通过在 '*'、 '+' 或 '?' 限定符后放置 '?',该表达式就从贪婪匹配转为了非贪婪或最小匹配。

 

定位符

到现在为止,所看到的示例都只斟酌查找任何地方出现的章节标题。出现的任何1个字符串 'Chapter' 后跟1个空格和1个数字多是1个真实的章节标题,也多是对其他章节的交叉援用。由于真实的章节标题总是出现在1行的开始,因此需要设计1个方法只查找标题而不查找交叉援用。

定位符提供了这个功能。定位符可以将1个正则表达式固定在1行的开始或结束。也能够创建只在单词内或只在单词的开始或结尾处出现的正则表达式。下表包括了正则表达式及其含义的列表:

字符

描写

^

匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 以后的位置。

$

匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。

\b

匹配1个单词边界,也就是指单词和空格间的位置。

\B

匹配非单词边界。

不能对定位符使用限定符。由于在1个换行符或单词边界的前面或后面不会有连续多个位置,因此诸如 '^*' 的表达式是不允许的。

要匹配1行文字开始位置的文字,请在正则表达式的开始处使用 '^' 字符。不要把 '^' 的这个语法与其在括号表达式中的语法弄混。它们的语法根本不同。

要匹配1行文字结束位置的文字,请在正则表达式的结束处使用 '$' 字符。

要在查找章节标题时使用定位符,下面的 JScript 正则表达式将匹配位于1行的开始处最多有两个数字的章节标题:

/^Chapter[1⑼][0⑼]{0,1}/

VBScript 中相同功能的正则表达式以下:

"^Chapter[1⑼][0⑼]{0,1}"

1个真实的章节标题不但出现在1行的开始,而且这1行中也唯一这1个内容,因此,它必定也位于1行的结束。下面的表达式确保所指定的匹配只匹配章节而不会匹配交叉援用。它是通过创建1个只匹配1行文字的开始和结束位置的正则表达式来实现的。

/^Chapter[1⑼][0⑼]{0,1}$/

对 VBScript 则使用:

"^Chapter[1⑼][0⑼]{0,1}$"

匹配单词边界有少量不同,但却给正则表达式增加了1个非常重要的功能。单词边界就是单词和空格之间的位置。非单词边界就是其他任何位置。下面的 JScript 表达式将匹配单词 'Chapter' 的前3个字符,由于它们出现在单词边界后:

/\bCha/

对 VBScript 为:

"\bCha"

这里 '\b' 操作符的位置很关键。如果它位于要匹配的字符串的开始,则将查找位于单词开头处的匹配;如果它位于改字符串的末尾,则查找位于单词结束处的匹配。例如,下面的表达式将匹配单词 'Chapter' 中的 'ter',由于它出现在单词边界之前:

/ter\b/

"ter\b"

下面的表达式将匹配 'apt',由于它位于 'Chapter' 中间,但不会匹配 'aptitude' 中的'apt':

/\Bapt/

"\Bapt"

这是由于在单词 'Chapter' 中 'apt' 出现在非单词边界位置,而在单词 'aptitude' 中位于单词边界位置。非单词边界操作符的位置不重要,由于匹配与1个单词的开头或结尾无关。

 

选择与编组

选择允许使用 '|' 字符来在两个或多个候选项中进行选择。通过扩大章节标题的正则表达式,可以将其扩充为不单单适用于章节标题的表达式。不过,这可没有想象的那末直接。在使用选择时,将匹配'|' 字符每边最可能的表达式。你可能认为下面的 JScript 和 VBScript 表达式将匹配位于1行的开始和结束位置且后跟1个或两个数字的 'Chapter' 或 'Section':

/^Chapter|Section[1⑼][0⑼]{0,1}$/

"^Chapter|Section[1⑼][0⑼]{0,1}$"

不幸的是,真实的情况是上面所示的正则表达式要末匹配位于1行开始处的单词 'Chapter',要末匹配1行结束处的后跟任何数字的 'Section'。如果输入字符串为 'Chapter 22',上面的表达式将只匹配单词 'Chapter'。如果输入字符串为 'Section 22',则该表达式将匹配 'Section 22'。但这类结果不是我们此处的目的,因此必须有1种办法来使正则表达式对所要做的更容易于响应,而且确切也有这类方法。

可使用圆括号来限制选择的范围,也就是说明确该选择只适用于这两个单词 'Chapter' 和 'Section'。不过,圆括号一样也是难处理的,由于它们也用来创建子表达式,有些内容将在后面关于子表达式的部份介绍。通过采取上面所示的正则表达式并在适当位置添加圆括号,就能够使该正则表达式既可以匹配 'Chapter 1',也能够匹配 'Section 3'。

下面的正则表达式使用圆括号将 'Chapter' 和 'Section' 组成1组,所以该表达式才能正确工作。对 JScript 为:

/^(Chapter|Section)[1⑼][0⑼]{0,1}$/

对 VBScript 为:

"^(Chapter|Section)[1⑼][0⑼]{0,1}$"

这些表达式工作正确,只是产生了1个有趣的副产品。在 'Chapter|Section' 两边放置圆括号建立了适当的编组,但也致使两个待匹配单词之1都被捕获供今后使用。由于在上面所示的表达式中只有1组圆括号,因此只能有1个捕获的 submatch。可使用 VBScript 的Submatches 集合或JScript 中RegExp 对象的 $1-$9 属性来援用这个子匹配。

有时捕获1个子匹配是所希望的,有时则是不希望的。在说明所示的示例中,真正想做的就是使用圆括号对单词 'Chapter' 或 'Section' 之间的选择编组。其实不希望在后面再援用该匹配。实际上,除非真的是需要捕获子匹配,否则请不要使用。由于不需要花时间和内存来存储那些子匹配,这类正则表达式的效力将更高。

可以在正则表达式模式圆括号内部的前面使用 '?:'来避免存储该匹配供今后使用。对上面所示正则表达式的下述修改提供了免除子匹配存储的相同功能。对 JScript:

/^(?:Chapter|Section)[1⑼][0⑼]{0,1}$/

对 VBScript:

"^(?:Chapter|Section)[1⑼][0⑼]{0,1}$"

除 '?:' 元字符,还有两个非捕获元字符用于称之为预查的匹配。1个为正向预查,用 ?= 表示, 在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串。1个为负向预查,用 '?!' 表示,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。

例如,假定有1个包括援用有 Windows 3.1、Windows 95、Windows 98 和 Windows NT 的文档。进1步假定需要更新该文档,方法是查找所有对 Windows 95、Windows 98 和 Windows NT 的援用,并将这些援用更改成 Windows 2000。可使用下面的 JScript 正则表达式,这是1个正向预查,来匹配 Windows 95、Windows 98 和 Windows NT:

/Windows(?=95|98 |NT )/

在 VBScript 要进行一样的匹配可使用下述表达式:

"Windows(?=95|98 |NT )"

找到1个匹配后,紧接匹配到的文字(而不包括预查中使用的字符)就开始对下1次匹配的搜索。例如,如果上面所示的表达式匹配到 'Windows 98',则将从 'Windows' 而不是 '98' 以后继续查找。

 

后向援用

正则表达式1个最重要的特性就是将匹配成功的模式的某部份进行存储供以后使用这1能力。请回想1下,对1个正则表达式模式或部份模式两边添加圆括号将致使这部份表达式存储到1个临时缓冲区中。可使用非捕获元字符 '?:', '?=', or '?!' 来疏忽对这部份正则表达式的保存。

所捕获的每一个子匹配都依照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每一个缓冲区都可使用 '\n' 访问,其中 n 为1个标识特定缓冲区的1位或两位10进制数。

后向援用1个最简单,最有用的利用是提供了肯定文字中连续出现两个相同单词的位置的能力。请看下面的句子:

Is is thecost of of gasoline going up up?

根据所写内容,上面的句子明显存在单词屡次重复的问题。如果能有1种方法无需查找每一个单词的重复现象就可以修改该句子就行了。下面的 JScript 正则表达式使用1个子表达式就能够实现这1功能。

/\b([a-z]+)\1\b/gi

等价的 VBScript 表达式为:

"\b([a-z]+)\1\b"

在这个示例中,子表达式就是圆括号之间的每项。所捕获的表达式包括1个或多个字母字符,即由'[a-z]+' 所指定的。该正则表达式的第2部份是对前面所捕获的子匹配的援用,也就是由附加表达式所匹配的第2次出现的单词。'\1'用来指定第1个子匹配。单词边界元字符确保只检测单独的单词。如果不这样,则诸如 "is issued" 或 "this is" 这样的短语都会被该表达式不正确地辨认。

在 JScript 表达式中,正则表达式后面的全局标志 ('g') 表示该表达式将用来在输入字符串中查找尽量多的匹配。大小写敏感性由表达式结束处的大小写敏感性标记 ('i') 指定。多行标记指定可能出现在换行符的两真个潜伏匹配。对 VBScript 而言,在表达式中不能设置各种标记,但必须使用 RegExp 对象的属性来显式设置。

使用上面所示的正则表达式,下面的 JScript 代码可使用子匹配信息,在1个文字字符串中将连续出现两次的相同单词替换为1个相同的单词:

var ss ="Is is the cost of of gasoline going up up?.\n";

var re =/\b([a-z]+) \1\b/gim;       //创建正则表达式样式.

var rv =ss.replace(re,"$1");   //用1个单词替换两个单词.

最接近的等价 VBScript 代码以下:

Dim ss,re, rv

ss ="Is is the cost of of gasoline going up up?." & vbNewLine

Set re =New RegExp

re.Pattern= "\b([a-z]+) \1\b"

re.Global= True

re.IgnoreCase= True

re.MultiLine= True

rv =re.Replace(ss,"$1")

请注意在 VBScript 代码中,全局、大小写敏感性和多行标记都是使用 RegExp 对象的适当属性来设置的。

在replace 方法中使用 $1 来援用所保存的第1个子匹配。如果有多个子匹配,则可以用 $2, $3 等继续援用。

后向援用的另外一个用处是将1个通用资源唆使符 (URI) 分解为组件部份。假定希望将下述的URI 分解为协议 (ftp, http, etc),域名地址和页面/路径:

http://msdn.microsoft.com:80/scripting/default.htm

下面的正则表达式可以提供这个功能。对 JScript,为:

/(\w+):\/\/([^/:]+)(:\d*)?([^#]*)/

对 VBScript 为:

"(\w+):\/\/([^/:]+)(:\d*)?([^#]*)"

第1个附加子表达式是用来捕获该 web 地址的协议部份。该子表达式匹配位于1个冒号和两个正斜杠之前的任何单词。第2个附加子表达式捕获该地址的域名地址。该子表达式匹配不包括 '^'、 '/' 或 ':' 字符的任何字符序列。第3个附加子表达式捕获网站端口号码,如果指定了该端口号。该子表达式匹配后跟1个冒号的零或多个数字。最后,第4个附加子表达式捕获由该 web 地址指定的路径和\或页面信息。该子表达式匹配1个和多个除'#' 或空格以外的字符。

将该正则表达式利用于上面所示的 URI 后,子匹配包括下述内容:

RegExp.$1包括 "http"

RegExp.$2包括 "msdn.microsoft.com"

RegExp.$3包括 ":80"

RegExp.$4包括 "/scripting/default.htm"

Demo

JAVASCRIPT中使用正则表达式

         Javascript中正则表达式对象的创建

         re = /pattern/[“flags”]    var re1 = /\d{3}/ig;

         re = newRegExp("pattern",["flags"])  var re2 = new RegExp("\\d{3}","ig");

         Flags可选项常见值:

         g (全文查找出现的所有pattern)

         i (疏忽大小写)

         RegExp对象经常使用方法:

         exec(): 返回的是1个数组。该数组包括了匹配该模式的第1个子字符串和该子字符串中匹配相干分组的字符串。比如:

var re =new RegExp("(\\d+)([a-z]+)","ig");

varresult = re.exec("33ff55tt77uu88yy"); 

返回的数组为:[33ff,33,ff]

         test(): 返回1个 Boolean 值,它指出在被查找的字符串中是不是存在模式匹配的子字符串

         字符串中经常使用的使用正则表达式的方式:

         match():使用正则表达式模式对字符串履行查找,并将符合该模式的所有子字符串包括到数组中返回。

var re =new RegExp("(\\d+)([a-z]+)","ig");

var t ="33ff55tt77uu88yy".match(re);

结果为数组:[33ff,55tt,77uu,88yy]

         search(): 返回与正则表达式查找内容匹配的第1个子字符串的位置

         split(regex):依照指定的模式切割字符串,返回1个数组。

var t = "asdfd33ff55tt77uu88yy".split(/\d+/);

       replace():

var t ="asdfd33ff55tt77uu88yy".replace(/\d+/g,"**");

针对表单域的验证,封装1个通用的函数

1.      分析用户名和邮箱验证的共同点:

a)      毛病提示文字都会放到某1个元素中。

b)      都不能为空

2.      分析用户名和邮箱验证的不同点:

a)      不为空时,还需要有其他的格式验证。(用户名:长度不能超过30. 邮箱:符合邮箱规格)

封装成的函数:

<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <metahttp-equiv="Content-Type" content="text/html;charset=GB18030" /> <title>UntitledDocument</title> <script> function check(frm){ /* var uname =frm.userName.value.replace(/(^\s+)|(\s+$)/g,""); var flag =true; document.getElementById("unameMsg").innerHTML=""; document.getElementById("pwdMsg").innerHTML=""; document.getElementById("ageMsg").innerHTML=""; if(uname.length==0){ document.getElementById("unameMsg").innerHTML="用户名不能为空!"; flag= false; }else{ if(!(/^\w+$/.test(uname))){ document.getElementById("unameMsg").innerHTML="用户名必须是:字母、数字、下划线!"; flag= false; } } var pwd = frm.pwd.value.replace(/(^\s+)|(\s+$)/g,""); if(pwd.length==0){ document.getElementById("pwdMsg").innerHTML="pwd不能为空!"; flag= false; }else{ if(!(/^\w+$/.test(pwd))){ document.getElementById("pwdMsg").innerHTML="pwd必须是:字母、数字、下划线!"; flag= false; } } var age =frm.age.value.replace(/(^\s+)|(\s+$)/g,""); if(age.length==0){ document.getElementById("ageMsg").innerHTML="age不能为空!"; flag= false; }else{ if(!(/^\d{3}$/.test(age))){ document.getElementById("ageMsg").innerHTML="年龄不能超过3位数或不是数字"; flag= false; } } returnflag; */ varunameFlag = checkField(frm.userName,$("unameMsg"),/^\w+$/,"用户名不能为空","用户名必须为字母、数字、下划线组成!"); var pwdFlag= checkField(frm.pwd,$("pwdMsg"),/^\w{6,16}$/,"pwd不能为空","用户名必须为字母、数字、下划线组成,并且长度在6⑴6位之间!"); var ageFlag=checkField(frm.age,$("ageMsg"),/^((\d{1,2})|(1[0123]\d))$/,"age不能为空","年龄不能高于139!"); returnunameFlag&&pwdFlag&&ageFlag; } function $(a){ return document.getElementById(a); } functioncheckField(fieldObj,msgObj,re,nullMsg,errorMsg){ msgObj.innerHTML= ""; var v =fieldObj.value.replace(/(^\s+)|(\s+$)/g,""); var flag =true; if(v.length==0){ msgObj.innerHTML=nullMsg; flag= false; }else{ if(!(re.test(v))){ msgObj.innerHTML=errorMsg; flag= false; } } returnflag; } </script> </head> <body> <formaction="formValidate.htm" name=testFrm onsubmit="returncheck(this);" > 用户名:<input type=textname=userName /> <span id=unameMsg></span> <br> 密码:<input type=passwordname=pwd /> <spanid=pwdMsg></span> <br> 年龄:<input type=text name=age /> <span id=ageMsg></span><br> <input type=submitvalue=注册 /> </form> </body> </html>

业务思想

关于【正则表达式】的认识是基于JavaScript上的,在先前的J2SE博客整理阶段,并未直接列出,经太长时间的接触和使用,不断刷新对其认识程度,方才在此时总结归纳出,不断给予自己挑战是证明自己不断向前最好的证明。

注:【两个“不断”和两个“证明”,来充实自己未来发展的道路,共勉之!】


生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生