正则表达式-理论基础篇
搬运自个人博客,旧址正则表达式-理论基础篇
什么是正则表达式?
能够称作划定规矩一个形貌字符情势的对象,正则表达式中的字母和数字,都是根据字面寄义举行婚配的。壮大的字符串婚配东西怎样竖立一个正则表达式?
运用RegExp()组织函数来建立RegExp对象
特别的直接量语法来建立,定义为包含在一对斜杠(/)之间的字符
例:var reg = /s$/;
, var reg = new RegExp(s$);
二者效果完全相同,用来婚配一切以字母“s”末端的字符串。
“文本情势”的正则表达式语法
1.直接量字符
非字母的字符婚配,这些字符须要经由过程反斜线(\)作前缀举行转义.
字 符 | 匹 配 |
---|---|
字母和数字字符 | 本身 |
\o | NUL字符 |
\t | 制表符 |
\n | 换行符 |
\v | 垂直制表符 |
\f | 换页符 |
\r | 回车符 |
\xnn | 由十六进制数nn指定的拉丁字符,例:\x0A 等价于\n |
\uxxxx | 由十六进制数xxxx指定的unicode字符,例:\u0009 等价于\t |
\cX | 控制字符^X,例:\cJ 等价于换行符\n |
具有特别寄义的标点标记:
^
, $
, .
, *
, +
, ?
, =
, !
, :
, |
, \
, /
,(
,)
,[
,]
,{
, }
想在正则表达式中运用这些字符的直接量举行婚配,则必需运用前缀”\”,其他标点标记(比方@和引号)无特别寄义,在正则表达式中根据字面寄义举行婚配。
2.字符类.
方括号,或,局限
将直接量字符零丁放进方括号内就构成了字符类。一个字符类能够婚配它包含的恣意字符。字符类能够运用连字符来示意字符局限。
字 符 | 含 义 |
---|---|
[...] | 方括号内的恣意字符 |
[^...] | 不在方括号内的恣意字符 |
. | 除换行相符其他unicode行终止符以外的恣意字符 |
\w | 任何ASCII符构成的的单词,同等[a-zA-Z0-9] |
\W | 任何不是ASCII符构成的的单词,同等[^a-zA-Z0-9] |
\s | 任何unicode空缺字符 |
\S | 任何非unicode空缺符的字符,注重\W 与\s 差别 |
\d | 任何ASCII数字等价于[0-9] |
\D | 除了ASCII数字以外的任何字符,等价于[^0-9] |
[\b] | 退格直接量(惯例) |
例:
/[a,b,c]/
:示意和字母”a”,”b”,”c”中的恣意一个都婚配/[a-z]/
:婚配拉丁字母表中的小写字母/[/s/d]/
:婚配恣意空缺符或数字
3. 反复
用以指定字符反复的标记
字 符 | 含 义 |
---|---|
{n,m} | 婚配前一项最少n次,但不能超过m次 |
{n,} | 婚配前一项n次或许更屡次 |
{n} | 婚配前一项n次 |
? | 婚配前一项0次或许1次(也就是前一项是可选的,等价于{0,1}) |
+ | 婚配前一项1次或许屡次(等价于{1,}) |
* | 婚配前一项0次或许屡次,等价于{0,} |
例:
/\d{2,4}/
:婚配2-4个数字。/\w{3}\d?/
:准确婚配三个单词和一个可选的数字。/\s+java\s+/
:婚配前后有1个或多个空格的字符串”java”/[^(]*/
:婚配0个或多个非左括号的字符(这里实际上能与"("
婚配)
在运用
"*"
,和"?"
时要注重,因为这些字符能婚配0个字符,因而它们许可什么都不婚配,例:/a*/
能婚配字符串”bbbb”,因其含有0个a。
上表中列出的婚配字符为”贪欲的”婚配,它老是尽量多地婚配,且许可后续的正则表达式继承婚配。
非贪欲婚配,只需在待婚配的字符后追随一个问号即可,
"?"
,+?
,*?
或{1,5}?
。例:/a+/
:婚配”aaa”时,三个字符都被婚配,/a+?/
:婚配”aaa”时,因其尽量少的婚配,只能婚配第一个a
4.挑选-分组和援用
包含:指定挑选项,自表达式分组,和援用前一子表达式的特别字符
挑选项的尝试婚配序次是从左到右,直到发明婚配项,若左侧胜利婚配就疏忽右侧的项。
正则表达式中圆括号的作用:
把零丁的项构成子表达式,以便于能够像处置惩罚自力单位一样,用
\|
,*
,+
或许?
等等来对单位内的项举行处置惩罚在完全的情势中定义子情势
许可在统一正则表达式的后部,援用前面的子表达式
字 符 | 含 义 |
---|---|
“|” | “|”挑选,婚配的是该标记左侧的子表达式或右侧的子表达式 |
(...) | 组合,将几个项组合成为一个单位,这个单位可经由过程”|”,* ,+ 或许? 等标记,加以润饰,而且能够记着和这个相婚配的字符串以供今后的援用运用 |
(?:..) | 只组合,把项组合到一个单位,但不影象与该组相婚配的字符 |
\n | 和第n个分组第一次婚配的字符相婚配,组是圆括号中的子表达式(也有能够嵌套的),组索引是从左到右的左括号数,”(?:情势的分组不编码” |
例:
/ab|cd|ef/
:能够婚配”ab”,也能够婚配”cd”,还能够婚配”ef”./\d{3}|[a-z]{4}/
:能够婚配3个数字,或许4个小写字母.(/[a-z]+(\d+)/)
:婚配一个或多个小写字母后追随了一名或多位数字,运用括号包裹后,能够从检索到的婚配中抽取数字了.
5.指定婚配位置
我们称这些元素为正则表达式的锚,它们将情势定位在搜刮字符串的特定位置上.
字 符 | 含 义 |
---|---|
^ | 婚配字符串的开首,在多行检索中,婚配一行的开首 |
$ | 婚配字符串的末端,在多行检索中,婚配一行的末端 |
\b | 婚配一个单词边境,简言之,就是位于字符\w和\W之间的位置,或位于字符\w和字符串的开首或末端之间的位置(须要注重:[\b]婚配的是退格符) |
\B | 婚配非单词边境的位置 |
例:
/^JavaScript$/
:婚配”JavaScript”单词/\B[Ss]cript/
:与”JavaScript”和”/postscript”婚配,但不与”script”与”Script”.
6.润饰符
申明高等婚配的划定规矩,放在”/”标记以外,第二条斜线后
字 符 | 含 义 |
---|---|
i | 实行不辨别大小写的婚配 |
g | 实行一个全局婚配,简言之,就是要找到一切的婚配,而不是在找到一个以后就住手 |
m | 多行婚配情势,^婚配一行的开首和字符串的开首,$婚配行的完毕和字符串的完毕 |
例:
/java$/im
:能够婚配”java”也能够婚配”Java\nis fun”
用于情势婚配的string要领
正则表达式的作用就是用来剖析字符串
1. search()
:
查找字符串,接收一个参数为正则表达式,返回返回一个与之婚配的子串的肇端位置,若未找到返回-1.
例:
JavaScript.search(/script/i);//返回4
search()
要领不支持全局属性检索,所以会疏忽润饰符g
2. replace()
:
用以实行检索与替代操纵,接收两个参数,第一个参数是一个正则,第二个是要举行替代的字符串
若第一个参数是字符串,
replace()
则会直接搜刮这个字符串若替代字符串中涌现了$加数字,那末
replace()
将用与指定的子表达式相婚配的文原本替代这两个字符.
例:
text.replace(/javascript/gi,"JavaScript");//将一切不辨别大小写的javascript都替代成,大小写准确的JavaScript.
//一段援用文本肇端于引号,完毕与引号.
//中心的内容地区,不能包含引号
var quote = /"([^"]*)"/g;
//援用中文半角引号替代英文引号,同时要坚持引号之间的内容(储存在$1中)没有被修正.
text.replace(quote,'“$1”');
3. match()
接收唯一一个参数,就是正则表达式,返回的是一个由婚配效果构成的数组.例:
"1 plus 2 equals 3".match(/\d+/g);//返回["1","2","3"]
若在这个正则表达式中没有设置润饰符g,
match()
就不会举行全局检索,它只检索第一个婚配。但纵然match()实行的不是全局检索,它也返回一个数组。在这类情况下,数组的第一个元素就是婚配的字符串,余下的元素则是正则表达式顶用圆括号括起来的子表达式。因而,假如macth()返回一个数组a,那末a[0]寄存的是完全的婚配,a[1]寄存的是与第一个圆括号括起来的表达式相婚配的子串,以此类推。为了和要领replace()坚持今后,a[n]寄存的是$n的内容。
例:剖析一个url
var url = /(\w+):\/\/([\w.]+)\/(\S*)/;
var text = "Visit my blog at http://www.example.com/~david";
var result = text.match(url);
if (result != null) {
var fullurl = result[0]; //包含 "http://www.example.com/"
var protocol = result[1]; //包含 "http"
var host = result[2]; //包含 "www.example.com"
var path = result[3]; //包含~david
}
4. split()
用以将调用它的字符串拆分为子串构成的数组,运用分隔符是
split()
的参数参数为字符串
"123,456,789".split(",");//返回["123","456","789"]
参数为正则
"1,2, 3,4 ,5".split(/\s*,\s*/)//返回["1","2"," 3","4 ","5"]
指定分隔符”,”,许可双方能够留有恣意多的空缺符
RegExp对象
RegExp对象用以建立新的RegExp对象,可接收两个参数,第二个可选.
RegExp对象的第一个参数为正则表达式的主体部份,也就是
/...../
之间的文本,无论是字符串直接量,照样正则表达式都运用”\”作为转义字符的前缀.第二个可选参数为指定正则表达式的润饰符,
i
,g
,m
或许他们的组合.参考:文本情势的则表达式-润饰符
例:
var reg = new RegExp("\\d{5}","g");//婚配全局情势下的5个数字
alert(reg.test("1J2a35786"));//true
alert(reg.test("1J2a356"));//false
RegExp属性
属性名 | 范例 | 寄义 |
---|---|---|
source | 只读字符串 | 包含正则表达式的文本 |
global | 只读布尔值 | 用以申明正则表达式是不是带有润饰g |
ignoreCase | 只读布尔值 | 用以申明正则表达式是不是带有润饰i |
multiline | 只读布尔值 | 用以申明正则表达式是不是带有润饰m |
lastIndex | 可读性的整数 | 若婚配情势中含有g ,这个属性储存在全部字符串中下一次检索的最先位置 |