正则表达式-理论基础篇

正则表达式-理论基础篇

搬运自个人博客,旧址正则表达式-理论基础篇

  • 什么是正则表达式?
    能够称作划定规矩一个形貌字符情势的对象,正则表达式中的字母和数字,都是根据字面寄义举行婚配的。壮大的字符串婚配东西

  • 怎样竖立一个正则表达式?

  1. 运用RegExp()组织函数来建立RegExp对象

  2. 特别的直接量语法来建立,定义为包含在一对斜杠(/)之间的字符

例:var reg = /s$/; , var reg = new RegExp(s$);
二者效果完全相同,用来婚配一切以字母“s”末端的字符串。

“文本情势”的正则表达式语法

1.直接量字符

非字母的字符婚配,这些字符须要经由过程反斜线(\)作前缀举行转义.

字 符匹 配
字母和数字字符本身
\oNUL字符
\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.挑选-分组和援用

包含:指定挑选项,自表达式分组,和援用前一子表达式的特别字符

  • 挑选项的尝试婚配序次是从左到右,直到发明婚配项,若左侧胜利婚配就疏忽右侧的项。

  • 正则表达式中圆括号的作用:

    1. 把零丁的项构成子表达式,以便于能够像处置惩罚自力单位一样,用\|,*,+或许?等等来对单位内的项举行处置惩罚

    2. 在完全的情势中定义子情势

    3. 许可在统一正则表达式的后部,援用前面的子表达式

字 符含 义
“|”“|”挑选,婚配的是该标记左侧的子表达式或右侧的子表达式
(...)组合,将几个项组合成为一个单位,这个单位可经由过程”|”,*,+或许?等标记,加以润饰,而且能够记着和这个相婚配的字符串以供今后的援用运用
(?:..)只组合,把项组合到一个单位,但不影象与该组相婚配的字符
\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,这个属性储存在全部字符串中下一次检索的最先位置
    原文作者:三省吾身丶丶
    原文地址: https://segmentfault.com/a/1190000003977848
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞