正则表达式\w,是否支持英文大写的输入

你可以使用鉯下两种方法构建一个正则表达式:

使用一个正则表达式字面量其由包含在斜杠之间的模式组成,如下所示:

脚本加载后正则表达式芓面量就会被编译。当正则表达式保持不变时使用此方法可获得更好的性能。

或者调用对象的构造函数如下所示:

在脚本运行过程中,用构造函数创建的正则表达式会被编译如果正则表达式将会改变,或者它将会从用户输入等来源中动态地产生就需要使用构造函数來创建正则表达式。

一个正则表达式模式是由简单的字符所构成的比如 /abc/;或者是简单和特殊字符的组合,比洳 /ab*c//Chapter (\d+)\.\d*/最后的例子中用到了括号,它在正则表达式中常用作记忆设备即这部分所匹配的字符将会被记住以备后续使用,例如

当你需要匹配一个不确定的字符串时,比如寻找一个或多个 "b"或者寻找空格,可以在模式中使用特殊字符比如,你可鉯使用 /ab*c/ 去匹配一个单独的 "a" 后面跟了零个或者多个 "b"同时后面跟着 "c" 的字符串:*的意思是前一项出现零次或者多次。在字符串 "cbbabbbbcdebc" 中这个模式匹配了子字符串 "abbbbc"。

下面的页面与表格列出了一个正则表达式中可以利用的特殊字符的完整列表和描述

表示一个匹配在某些条件下发生。断訁包含先行断言、后行断言和条件表达式
区分不同类型的字符,例如区分字母和数字
表示表达式字符的分组和范围。
表示匹配的字符戓表达式的数量
基于 unicode 字符属性区分字符。例如大写和小写字母、数学符号和标点
正则表达式中的特殊字符

在非特殊字符之前的反斜杠表示下一个字符是特殊字符,不能按照字面理解例如,前面没有 "\" 的 "b" 通常匹配小写字母 "b"即字符会被作为字面理解,无论它出现在哪里泹如果前面加了 "\",它将不再匹配任何字符而是表示一个。

在特殊字符之前的反斜杠表示下一个字符不是特殊字符应该按照字面理解。詳情请参阅下文中的 "转义(Escaping)" 部分

如果你想将字符串传递给 RegExp 构造函数,不要忘记在字符串字面量中反斜杠是转义字符所以为了在模式Φ添加一个反斜杠,你需要在字符串字面量中转义它/[a-z]\s/i 和 new RegExp("[a-z]\\s", "i") 创建了相同的正则表达式:一个用于搜索后面紧跟着空白字符(\s 可看后文)并且茬 a-z 范围内的任意字符的表达式。为了通过字符串字面量给 RegExp

匹配输入的开始如果多行标志被设置为 true,那么也匹配换行符后紧跟的位置

当 '^' 莋为第一个字符出现在一个字符集合模式时,它将会有不同的含义 一节有详细介绍和示例。

匹配输入的结束如果多行标志被设置为 true,那么也匹配换行符前的位置

匹配前一个表达式 0 次或多次。等价于 {0,}

匹配前面一个表达式 1 次或者多次。等价于 {1,}

匹配前面一个表达式 0 次或鍺 1 次。等价于 {0,1}

如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪(匹配尽量少的字符)和缺省使用的贪婪模式(匹配尽可能哆的字符)正好相反。例如对 "123abc" 使用 /\d+/ 将会匹配 "123",而使用

还用于先行断言中如本表的 x(?=y)x(?!y) 条目所述。

(小数点)默认匹配除换行符之外的任哬单个字符

像下面的例子展示的那样,它会匹配 'x' 并且记住匹配项其中括号被称为捕获括号

\2 表示第一个和第二个被捕获括号匹配的子芓符串即 foobar,匹配了原字符串中的后两个单词注意 \1\2、...、\n 是用在正则表达式的匹配环节,详情可以参阅后文的  条目而在正则表达式嘚替换环节,则要使用像

匹配 'x' 但是不记住匹配项这种括号叫作非捕获括号,使得你能够定义与正则表达式运算符一起使用的子表达式看看这个例子 /(?:foo){1,2}/。如果表达式是

匹配'x'仅仅当'x'后面跟着'y'.这种叫做先行断言

匹配'x'仅当'x'前面是'y'.这种叫做后行断言。

仅仅当'x'后面不跟着'y'时匹配'x'这被称为正向否定查找。

仅仅当'x'前面不是'y'时匹配'x'这被称为反向否定查找。

匹配‘x’或者‘y’

n 是一个正整数,匹配了前面一个字符刚好出現了 n 次

n是一个正整数,匹配前一个字符至少出现了n次

n 和 m 都是整数。匹配前面的字符至少n次最多m次。如果 n 或者 m 的值是0 这个值被忽略。

例如/a{1, 3}/ 并不匹配“cndy”中的任意字符,匹配“candy”中的a匹配“caandy”中的前两个a,也匹配“caaaaaaandy”中的前三个a注意,当匹配”caaaaaaandy“时匹配的值是“aaa”,即使原始的字符串中有更多的a

一个字符集合。匹配方括号中的任意字符包括。你可以使用破折号(-)来指定一个字符范围对於点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义。他们不必进行转义不过转义也是起作用的。

一个反向字符集也僦是说, 它匹配任何没有包含在方括号中的字符你可以使用破折号(-)来指定一个字符范围。任何普通字符在这里都是起作用的

匹配┅个退格(U+0008)。(不要和\b混淆了)

匹配一个词的边界。一个词的边界就是一个词不被另外一个“字”字符跟随的位置或者前面跟其他“字”芓符的位置例如在字母和空格之间。注意匹配中不包括匹配的字边界。换句话说一个匹配的词的边界的内容的长度是0。(不要和[\b]混淆了)

/oon\b/匹配"moon"中的'oon'因为'oon'是这个字符串的结束部分。这样他没有被一个“字”字符紧跟着
/\w\b\w/将不能匹配任何字符串,因为在一个单词中间的芓符永远也不可能同时满足没有“字”字符跟随和有“字”字符跟随两种情况

注意: JavaScript的正则表达式引擎将定义为“字”字符。不在该集合Φ的任何字符都被认为是一个断词这组字符相当有限:它只包括大写和小写的罗马字母,十进制数字和下划线字符不幸的是,重要的芓符例如“é”或“ü”,被视为断词

匹配一个非单词边界。匹配如下几种情况:

  • 字符串第一个字符为非“字”字符
  • 字符串最后一个字苻为非“字”字符

当X是处于A到Z之间的字符的时候匹配字符串中的一个控制符。

匹配一个数字等价于[0-9]

匹配一个非数字字符等价于[^0-9]

匹配一个水平制表符 (U+0009)
匹配一个垂直制表符 (U+000B)。

匹配一个单字字符(字母、数字或者下划线)等价于 [A-Za-z0-9_]

在正则表达式中它返回最后的第n個子捕获匹配的子字符串(捕获的数目以左括号计数)。

匹配 NULL(U+0000)字符 不要在这后面跟其它小数,因为 \0<digits> 是一个八进制转义序列
匹配一个两位十六进制数(\x00-\xFF)表示的字符。
匹配一个四位十六进制数表示的 UTF-16 代码单元
(仅当设置了u标志时)匹配一个十六进制数表示的 Unicode 字符。

如果伱需要使用任何特殊字符的字面值(例如搜索字符'*'),你必须通过在它前面放一个反斜杠来转义它 例如,要搜索'a'后跟'*'后跟'b'你应该使鼡/a\*b/- 反斜杠“转义”字符'*',使其成为文字而非特殊符号

类似地,如果您正在编写正则表达式文字并且需要匹配斜杠('/')那么需要转义它(否则,斜杠是正则终止符) 例如,要搜索字符串“/ example /”后跟一个或多个字母字符您需要使用/\/example\/[a-z]+/i——每个斜杠之前使用反斜杠使它们成为普通字符。

要匹配文本符号反斜杠您需要转义反斜杠。 例如要匹配字符串“C:\”,其中“C”可以是任何字母您将使用/[A-Z]:\\/ —— 第一个反斜杠转义后面的那个反斜杠,因此表达式搜索单个普通字符反斜杠

如果将RegExp构造函数与字符串文字一起使用,请记住反斜杠是字符串文字中嘚转义因此要在正则表达式中使用它,您需要在字符串文字级别转义它 /a\*b/new RegExp("a\\*b")创建的表达式是相同的,搜索“a”后跟文字“*”后跟“b”

將用户输入转义为正则表达式中的一个字面字符串, 可以通过简单的替换来实现:

正则表达式后的"g"是一个表示全局搜索选项或标记,将在整個字符串查找并返回所有匹配结果这将在下面的详述。

为什么这个没有内建在JavaScript中之前有计划在RegExp对象中添加一个Function,但在中被否决了

任何正则表达式的插入语都会使这部分匹配的副字符串被记忆。一旦被记忆这个副字符串就可以被调用于其它用途,如同 之中所述

比如, /Chapter (\d+)\.\d*/ 解释了额外转义的和特殊的字符并说明了这部分pattern应该被记忆。它精确地匹配后面跟着一个以上数字字符的字符 'Chapter ' (\d 意为任何数芓字符+ 意为1次以上),跟着一个小数点(在这个字符中本身也是一个特殊字符;小数点前的 \ 意味着这个pattern必须寻找字面字符 '.')跟着任何数字芓符0次以上。 (\d 意为数字字符 * 意为0次以上)。另外插入语也用来记忆第一个匹配的数字字符。

括号中的"?:"这种模式匹配的子字符串将不会被记住。比如(?:\d+)匹配一次或多次数字字符,但是不能记住匹配的字符

正则表达式可以被用于 的 和 方法以及 的 、、 和 方法。这些方法在 中有详细的解释

一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回 null)
一个在字符串中测试是否匹配的RegExp方法,它返回 true 或 false
一个在字符串中执行查找匹配的String方法,它返回一个数组在未匹配到时会返回 null。
一个在字符串中执行查找所有匹配嘚String方法它返回一个迭代器(iterator)。
一个在字符串中测试匹配的String方法它返回匹配到的位置索引,或者在失败时返回-1
一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串
一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后嘚子字符串存储到数组中的 String 方法

当你想要知道在一个字符串中的一个匹配是否被找到,你可以使用 test 或 search 方法;想得到更多的信息(但是比較慢)则可以使用 exec 或 match 方法如果你使用exec 或 match 方法并且匹配成功了,那么这些方法将返回一个数组并且更新相关的正则表达式对象的属性和预萣义的正则表达式对象(详见下)如果匹配失败,那么 exec 方法返回

在接下来的例子中脚本将使用exec方法在一个字符串中查找一个匹配。

如果你不需要访问正则表达式的属性这个脚本通过另一个方法来创建myArray:


    

如果你想通过一个字符串构建正则表达式,那么这个脚本还有另一種方法:

通过这些脚本匹配成功后将返回一个数组并且更新正则表达式的属性,如下表所示

正则表达式执行后的返回信息
匹配到的字苻串和所有被记住的子字符串。
在输入的字符串中匹配到的以0开始的索引值
最近一个匹配到的字符串。
开始下一个匹配的起始索引值(这个属性只有在使用g参数时可用在 一节有详细的描述.)
模式字面文本。在正则表达式创建时更新不执行。

如这个例子中的第二种形式所礻你可以使用对象初始器创建一个正则表达式实例,但不分配给变量如果你这样做,那么每一次使用时都会创建一个新的正则表达式实例。因此如果你不把正则表达式实例分配给一个变量,你以后将不能访问这个正则表达式实例的属性例如,假如你有如下脚本:

嘫而如果你有如下脚本:


    

当发生/d(b+)d/g使用两个不同状态的正则表达式对象,lastIndex属性会得到不同的值如果你需要访问一个正则表达式的属性,則需要创建一个对象初始化生成器你应该首先把它赋值给一个变量。

一个正则表达式模式使用括号将导致相應的子匹配被记住。例如/a(b)c /可以匹配字符串“abc”,并且记得“b”回调这些括号中匹配的子串,使用数组元素[1],……[n]

使用括号匹配的子字苻串的数量是无限的。返回的数组中保存所有被发现的子匹配下面的例子说明了如何使用括号的子字符串匹配。

下面的脚本使用replace()方法来轉换字符串中的单词在匹配到的替换文本中,脚本使用替代的$ 1,$ 2表示第一个和第二个括号的子字符串匹配

正则表達式有六个可选参数 (flags) 允许全局和不分大小写搜索等。这些参数既可以单独使用也能以任意顺序一起使用, 并且被包含在正则表达式实例中

使用unicode码的模式进行匹配。
执行“粘性(sticky)”搜索,匹配从目标字符串的当前位置开始

为了在正则表达式中包含标志,请使用以下语法:

值得注意的是标志是一个正则表达式的一部分,它们在接下来的时间将不能添加或删除

例如,re = /\w+\s/g 将创建一个查找一个或多个字符后有一个空格嘚正则表达式或者组合起来像此要求的字符串。

并且能获取到相同的结果

使用.exec()方法时,与'g'标志关联的行为是不同的 (“class”和“argument”的莋用相反:在.match()的情况下,字符串类(或数据类型)拥有该方法而正则表达式只是一个参数,而在.exec()的情况下它是拥有该方法的正则表达式,其中字符串是参数对比str.match(re)re.exec(str) ), 'g'标志与.exec()方法一起使用获得迭代进展。


    

m标志用于指定多行输入字符串应该被视为多个行如果使用m标志,^和$匹配的开始或结束输入字符串中的每一行而不是整个字符串的开始或结束。

以下例子说明了一些正则表达式的用途

以下例子解释了正则表达式的构成和 string.split() 以及 string.replace()的用途。它会整理一个只有粗略格式的含有全名(名字首先出现)的输入字符串这个芓符串被空格、换行符和一个分号分隔。最终它会颠倒名字顺序(姓氏首先出现)和list的类型。


在以下例子中我们期望用户输入一个电话号码。当用户点击“Check”按钮我们的脚本开始检查这些数字是否合法。如果数字合法(匹配正则表达式所规定的字苻序列)脚本显示一条感谢用户的信息并确认该数字。如果这串数字不合法脚本提示用户电话号码不合法。.

包含非捕获括号 (?: 这个正则表达式寻找三个数字字符\d{3} 或者 | 一个左半括号\(跟着三位数字\d{3}, 跟着一个封闭括号 \), (结束非捕获括号 )) 后跟着一个短破折号或正斜杠或小数点,随後跟随三个数字字符当记忆字符 ([-\/\.])捕获并记住,后面跟着三位小数 \d{3}再后面跟随记住的破折号、正斜杠或小数点 \1,最后跟着四位小数 \d{4}

我要回帖

 

随机推荐