JS正则表达式

JavaScript 正则表达式

正则表达式是由一个字符序列形成的搜索模式。

正则表达式可以是一个简单的字符,或一个更复杂的模式。可用于所有文本搜索和文本替换的操作。

语法:/正则表达式主体/修饰符(可选)

var patt = /runoob/i
//其中runoob  是一个正则表达式主体 (用于检索)、i  是一个修饰符 (搜索不区分大小写)。

正则表达式模式

  • 方括号用于查找某个范围内的字符:
表达式描述
[abc]查找方括号之间的任何字符。
[0-9]查找任何从 0 至 9 的数字。
(x|y)查找任何以 | 分隔的选项。
  • 元字符是拥有特殊含义的字符:
元字符描述
\d查找数字。
\s查找空白字符。
\b匹配单词边界。
\uxxxx查找以十六进制数 xxxx 规定的 Unicode 字符。
  • 量词:
量词描述
n+匹配任何包含至少一个 n 的字符串。
n*匹配任何包含零个或多个 n 的字符串。
n?匹配任何包含零个或一个 n 的字符串。

正则表达式修饰符

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

修饰符 可以在全局搜索中不区分大小写:

  • 正则表达式标志
标志描述
g全局搜索。(查找所有匹配而非在找到第一个匹配后停止)。
i执行对大小写不敏感的匹配,不区分大小写搜索。
m多行搜索。
u使用unicode码的模式进行匹配。
s特殊字符原点.,其原点.匹配除了换行符\n以外的任何字符,加上s修饰符后,原点.中包含换行符\n
y执行“粘性(sticky)”搜索,匹配从目标字符串的当前位置开始。

使用正则表达式的方法

在 JS 中,RegExp 对象是一个预定义了属性和方法的正则表达式对象。

常用的正则表达式的方法

  • search()  用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。在失败时返回-1。
  • test()  用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
  • replace()   用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。
  • exec()  用于检索字符串中的正则表达式的匹配。该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

例如:

search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。

//使用正则表达式搜索 "Runoob" 字符串,且不区分大小写:
var str = "Visit Runoob!"; var n = str.search(/Runoob/i);
//输出结果为:
6

test() 方法 用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。

//写法一:
var patt = /e/;
patt.test("The best things in life are free!");
//字符串中含有 "e",所以该实例输出为:
true

//写法二:
/e/.test("The best things in life are free!")

正则表达式中的特殊字符

\

反斜杠是转义字符。 如果前面加了 "\",它将不再匹配任何字符,而是表示一个字符边界。

例:/[a-z]\s/i 和 new RegExp("[a-z]\\s", "i") 创建了相同的正则表达式:一个用于搜索后面紧跟着空白字符;并且在 a-z 范围内的任意字符的表达式

^

区分大小写。

例:/^A/ 并不会匹配 "an A" 中的 'A',但是会匹配 "An E" 中的 'A'。

$

匹配输入的结束。

例:/t$/ 并不会匹配 "enter" 中的 't',但是会匹配 "eat" 中的 't'。

*

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

例:/bo*/ 会匹配 "A ghost boooooed" 中的 'booooo' 和 "A bird warbled" 中的 'b',但是在 "A goat grunted" 中不会匹配任何内容。

+

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

例:/a+/ 会匹配 "candy" 中的 'a' 和 "caaaaandy" 中所有的 'a',但在 "cndy" 中不会匹配任何内容。

?

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

例:/e?le?/ 匹配 "angel" 中的 'el'、"angle" 中的 'le' 、 "oslo' 中的 'l'。

紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。

例:对 "123abc" 使用 /\d+/ 将会匹配 "123",而使用 /\d+?/ 则只会匹配到 "1"。

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

.

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

例:/.n/ 将会匹配 "nay, an apple is on the tree" 中的 'an' 和 'on',但是不会匹配 'nay'。

若 s ("dotAll") 标志位被设为 true,它也会匹配换行符。

(x)

它会匹配 'x' 并且记住匹配项。其中括号被称为捕获括号。

例:/(foo)(bar) \1\2/ , \1 和 \2 表示第一个和第二个被捕获括号匹配的子字符串,即 foo 和 bar,匹配了原字符串中的后两个单词。

(?:x)

匹配 'x' 但是不记住匹配项。这种括号叫作非捕获括号。

例:/(?:foo){1,2}/,如果表达式是 /foo{1,2}/{1,2} 将只应用于 'foo' 的最后一个字符 'o'。如果使用非捕获括号,则 {1,2} 会应用于整个 'foo' 单词。

x(?=y)

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

例:/Jack(?=Sprat|Frost)/匹配‘Jack’仅当它后面跟着'Sprat'或者是‘Frost’。但‘Sprat’和‘Frost’都不是匹配结果的一部分。

(?<=y)x

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

例:/(?<=Jack|Tom)Sprat/匹配‘ Sprat ’仅仅当它前面是'Jack'或者是‘Tom’。但‘Jack’和‘Tom’都不是匹配结果的一部分。

x(?|y)

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

例:仅当这个数字后面没有跟小数点的时候,/\d+(?!\.)/ 匹配一个数字。

例:/\d+(?!\.)/.exec("3.141")匹配‘141’而不是‘3.141’

(?<!y)x

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

例:仅当这个数字前面没有负号的时,

/(?<!-)\d+/ 匹配一个数字。
/(?<!-)\d+/.exec('3') 匹配到 "3".
/(?<!-)\d+/.exec('-3') 因为这个数字前有负号,所以没有匹配到。

x|y

匹配‘x’或者‘y’。

例:/green|red/匹配“green apple”中的‘green’和“red apple”中的‘red’

{n}

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

例: /a{2}/ 不会匹配“candy”中的'a',但是会匹配“caandy”中所有的 a,以及“caaandy”中的前两个'a'。

{n,}

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

例如, /a{2,}/ 匹配 "aa", "aaaa" 和 "aaaaa" 但是不匹配 "a"。

{n,m}

n 和 m 都是整数。匹配前面的字符至少n次,最多m次。

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

[xyz]

 一个字符集合。匹配方括号中的任意字符,包括转义序列。可用破折号(-)来指定一个字符范围。

例:[abcd] 和[a-d]是一样的,都匹配"brisket"中的‘b’,也都匹配“city”中的‘c’。对于点(.)和星号(*)这样的特殊符号在一个字符集中没有特殊的意义,可不必进行转义,但若转义也是起作用的。

例:/[a-z.]+/ 和/[\w.]+/与字符串“test.i.ng”匹配。

[^xyz]

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

例:[^abc] 和 [^a-c] 是一样的。他们匹配"brisket"中的‘r’,也匹配“chop”中的‘h’。

[\b]匹配一个退格(U+0008)。
\b

匹配一个词的边界(一个词的边界就是一个词不被另外一个“字”字符(特定的字符集)跟随的位置或者前面跟其他“字”字符的位置,例如在字母和空格之间。)。一个匹配的词的边界的内容的长度是0。

用"moon"举例:
/\bm/匹配“moon”中的‘m’;
/oo\b/并不匹配"moon"中的'oo',因为'oo'被一个“字”字符'n'紧跟着。
/oon\b/匹配"moon"中的'oon',因为'oon'是这个字符串的结束部分。这样他没有被一个“字”字符紧跟着。

/\w\b\w/将不能匹配任何字符串,因为在一个单词中间的字符永远也不可能同时满足没有“字”字符跟随和有“字”字符跟随两种情况。

\B

匹配一个非单词边界。

匹配如下几种情况:

字符串第一个字符为非“字”字符

字符串最后一个字符为非“字”字符

两个单词字符之间

两个非单词字符之间

空字符串

例:/\B../匹配"noonday"中的'oo', 而/y\B../匹配"possibly yesterday"中的’yes‘

\cX

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

例:/\cM/ 匹配字符串中的 control-M (U+000D)。

\d

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

例:/\d/ 或者 /[0-9]/ 匹配"B2 is the suite number."中的'2'。

\D

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

例: /\D/ 或者 /[^0-9]/ 匹配"B2 is the suite number."中的'B' 。

\f匹配一个换页符 (U+000C)。
\n匹配一个换行符 (U+000A)。
\r匹配一个回车符 (U+000D)。
\s

匹配一个空白字符,包括空格、制表符、换页符和换行符。

等价于[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]。

经官方测试,\s不匹配"\u180e",返回false。

例: /\s\w*/ 匹配"foo bar."中的' bar'。

\S

匹配一个非空白字符。

等价于 [^ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

例:/\S\w*/ 匹配"foo bar."中的'foo'。

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

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

例: /\w/ 匹配 "apple," 中的 'a',"$5.28,"中的 '5' 、 "3D." 中的 '3'。

\W

匹配一个非单字字符。等价于 [^A-Za-z0-9_]

例: /\W/ 匹配 "50%." 中的 '%'。

\n

返回最后的第n个子捕获匹配的子字符串(捕获的数目以左括号计数)。

例: /apple(,)\sorange\1/ 匹配"apple, orange, cherry, peach."中的'apple, orange,' 。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值