关于javascript:javascript正则表达式

38次阅读

共计 8884 个字符,预计需要花费 23 分钟才能阅读完成。

JavaScript 有两种形式创立正则表达式

> var regexConst = new RegExp('abc'); // 构造函数形式
> var regexLiteral = /abc/; // 字面量形式

有一点要留神,字面量申明是在 // 外面申明,而构造函数申明传进去的参数是字符串,所有遇到一些 \n 这样转义字符,须要双重本义,变成 \\n,上面列出了一些例子:

正则表达式相干函数

test():RegExp 对象提供的办法。检索字符串中指定的值。匹配胜利返回 true 否则返回 false

var regex = /hello/;
var str = 'hello world';
var result = regex.test(str);
console.log(result);

exec():RegExp 对象提供的办法。检索字符串中指定的值。匹配胜利返回一个数组,匹配失败返回 null

var reg=/hello/;
console.log(reg.exec('hellojs'));//['hello']
console.log(reg.exec('javascript'));//null

match():字符对象提供的办法。在字符串内检索指定的值, 匹配胜利返回寄存匹配后果的数组,否则返回 null。这里须要留神的一点事,如果没有设置全局匹配 g,返回的数组只存第一个胜利匹配的值。

var reg1=/javascript/i;
var reg2=/javascript/ig;
console.log('hello Javascript Javascript Javascript'.match(reg1));
//['Javascript']
console.log('hello Javascript Javascript Javascript'.match(reg2));
//['Javascript','Javascript','Javascript']

search():字符对象提供的办法。在字符串内检索指定的值, 匹配胜利返回第一个匹配胜利的字符串片段开始的地位,否则返回 -1。

var reg=/javascript/i;
console.log('hello Javascript Javascript Javascript'.search(reg));//6

replace():字符对象提供的办法。替换与正则表达式匹配的子串,并返回替换后的字符串。在不设置全局匹配 g 的时候,只替换第一个匹配胜利的字符串片段。

var reg1=/javascript/i;
var reg2=/javascript/ig;
console.log('hello Javascript Javascript Javascript'.replace(reg1,'js'));
//hello js Javascript Javascript
console.log('hello Javascript Javascript Javascript'.replace(reg2,'js'));
//hello js js js

split():字符对象提供的办法。把一个字符串宰割成字符串数组。

var reg=/1[2,3]8/;
console.log('hello128Javascript138Javascript178Javascript'.split(reg));
//['hello','Javascript','Javascript178Javascript']

最简略的正则表达式

var regex = /hello/;
console.log(regex.test('hello world'));
// true

修饰符

有三种:i, g, m,能够同时呈现,没有程序(即 gi 与 ig 一样),请参考下方阐明
修饰符阐明:
i 疏忽大小写匹配
g 全局匹配,即是匹配一个后持续匹配,直到完结
m 多行匹配,即是遇到换行后不进行匹配,直到完结

例子:

'abc'.match(/abc/); //['abc']
'abcd'.match(/abc/); //['abc'] 没有 / g 只返回第一个胜利匹配的值
'abcdabc'.match(/abc/g); //['abc', 'abc'] 
'abCabc'.match(/abc/gi); //['abc', 'abc']
'abC\nabc'.match(/abc/gim); //['abc', 'abc']  \n 是换行符

方括号 [] 用法

局部元字符阐明

例子:

'aBcd efg'.match(/[a-z]+/); // ["a"] 
'aBcd efg'.match(/[a-z]+/i); // ["aBcd"] 
'aBcd efg'.match(/[a-z]+/g); // ["a", "cd", "efg"] 
'aBcd efg'.match(/[a-z]+/gi); // ["aBcd", "efg"] 
'aB\ncd\n efg'.match(/^[a-z]+/m); // ["a"] 
'aB\ncd\n efg'.match(/^[a-z]+/g); // ["a"] 
'aB\ncd\n efg'.match(/^[a-z]+/gm); // ["a", "cd"] // 留神不是 ["a", "cd", "efg"]
'adobe 2016'.match(/\d+|[a-z]+$/g); // ["2016"]
'adobe'.match(/\d+|[a-z]+$/g); // ["adobe"]
'adobe2016ps'.match(/\d+|^[a-z]+/g); // ["adobe", "2016"]

总结 ^ 的用法:

  • 在 [] 内开始地位:

    'adobe 2016'.match(/^[a-zA-Z]+/); // ["adobe"]
  • 在正则双斜线开始地位:

    'adobe'.match(/[^abc]/g); // ["d", "o", "e"]
  • 带有 | 字符中应用:

    'adobe2016ps'.match(/\d+|^[a-z]+/g); // ["adobe", "2016"]
  • 在其余地位:

    '12a^eee'.match(/a\^/g); // ['a^']

示意所有字母,不辨别大小写:

'adobe-PS'.match(/[a-z]/gi); // ["a", "d", "o", "b", "e", "P", "S"]
'adobe-PS'.match(/[a-zA-Z]/g); // ["a", "d", "o", "b", "e", "P", "S"]

一些隐性概念

正则中大部分都是匹配单个字符:

'adobe 2016'.match(/[a-z]/g) //["a", "d", "o", "b", "e"]

少部分匹配后果是字符串而不是单个字符:

'aBcd efg'.match(/[a-z]+/i); // ["aBcd"]

两个规定紧挨着,阐明匹配的时候,这两个字符是相连的:

'adobe-2016'.match(/[a-g\-]/g); // ["a", "d", "b", "e", "-"] 
// 对连字符 - 自身进行匹配,须要用反斜线本义
'addo2-ado12os3'.match(/o\d/g); //['o2', 'o1']

耗费字符的概念:如下这个例子,不是[“adobw12px”,”ps15test”],因为 ps 这两个字符曾经消耗掉了

'adobe12ps15test'.match(/[a-z]+\d+[a-z]+/); // ["adobe12ps"]

匹配模式默认是贪心的,尽可能多的匹配所搜寻的字符串:

'aBcd efg'.match(/[a-z]+/gi);// ["aBcd", "efg"]
'a3 aaa12bb aaaaaaa34'.match(/a{2,4}\d+/g); 
// ["aaa12", "aaaa34"]  a{2,4}:2 到 4 个 a,大括号的用法前面会细讲

非凡含意字符

  • . 匹配任意单个字符,除换行和结束符

      '1+0.2*2=1.4'.match(/.{2}/g);
      // ["1+", "0.", "2*", "2=", "1."]
  • \w 匹配任意单词字符(数字、字母、下划线),等价于[A-Za-z0-9_]

      'ad34~!@$ps'.match(/\w/g);
      // ["a", "d", "3", "4", "p", "s"]
    
  • \W 匹配任意单词字符,与 \w 相同,等价于1

      'ad34~!@$ps'.match(/\W/g);
      // ["~", "!", "@", "$"]
  • \d 匹配数字,等价于 [0-9]

    'ps6'.match(/\d/g);
     // ["6"]
  • \D 匹配非数字,等价于 [0-9]

      'ps6'.match(/\D/g);
      // ["p", "s"]
  • \s 匹配空白字符,次要有 (\n、\f、\r、\t、\v),留神 ’a\sb’ 中的 \s 仍然是字符 s,所以 ’a\sb’.match(/\s/g) 返回 null

      'adobe ps'.match(/\s/g);
      // [" "]
  • \S 匹配非空白字符,与 \s 相同

      'adobe ps'.match(/\S/g);
      // ["a", "d", "o", "b", "e", "p", "s"]
  • \b 匹配单词边界,留神间断的数字、字母或下划线组成的字符串会认为一个单词

      'adobe(2016) ps6.4'.match(/\b(\w+)/g);
      // ["adobe", "2016", "ps6", "4"]
  • \B 匹配非单词边界,认真领会上面的示例与 \b 的后果

      'adobe(2016) ps6.4'.match(/\B(\w+)/g);
      // ["dobe", "016", "s6"]
  • \0 匹配 NUL 字符

    '\0'.match(/\0/);
     // ["NUL"]
  • \n 匹配换行符(编码:10,newline)

      'adobe\nps'.match(/\n/).index;
      // 5
  • \f 匹配换页符

      'adobe\fps'.match(/\f/).index;
      // 5
  • \r 匹配回车符(编码:13,return)

      'adobe\rps'.match(/\r/).index;
      // 5
  • \t 匹配制表符,键盘 tab 对应的字符

      'adobe\tps'.match(/\t/).index;
      // 5
  • \v 匹配垂直制表符

      'adobe\vps'.match(/\v/).index;
      // 5
  • \xxx 匹配以八进制数 xxx 规定的字符

      'a'.charCodeAt(0).toString(8);
      // "141"
      'adobe ps'.match(/\141/g);
      // ["a"]
  • \xdd 匹配以十六进制数 dd 规定的字符

      'a'.charCodeAt(0).toString(16);
      // "61"
      'adobe ps'.match(/\x61/g);
      // ["a"]
  • \uxxxx 匹配以十六进制数 xxxx 规定的 Unicode 字符,留神位数不够须要补 0

      'a'.charCodeAt(0).toString(16);
      // "61"
      'adobe ps'.match(/\u0061/g);
      // ["a"]

    量词阐明

  • n+ 匹配蕴含至多一个 n 的字符串

      'adobe paas'.match(/a+\w+/g);
      // ["adobe", "aas"]
  • n* 匹配蕴含零个或多个 n 的字符串

      'ab3 aa12bb'.match(/a*\d+/g);
      // ["3", "aa12"]
  • n? 匹配蕴含零个或一个 n 的字符串

      'ab3 aa12bb'.match(/a?\d+/g);
      // ["3", "a12"]
  • n{x} 匹配蕴含间断 x 个 n 的字符串

      'ab3 aa12bb aaa34'.match(/a{2}\d+/g);
      // ["aa12", "aa34"]
  • n{x,y} 匹配蕴含至多间断 x 个且最多间断 y 个 n 的字符串

      'a3 aaa12bb aaaaaaa34'.match(/a{2,4}\d+/g);
      // ["aaa12", "aaaa34"]
  • n{x,} 匹配蕴含至多间断 x 个 n 的字符串

      'a3 aaa12bbaa4'.match(/a{2,}\d+/g);
      // ["aaa12", "aa4"]

由上可知,以下 表达式 1 与 表达式 2 等价

小括号 () 用法

  • 分组的用法,即捕捉的用法:
'https://baidu.com'.match(/https:\/{2}\w+\.com$/g); //['https://baidu.com']
'https://baidu.com'.match(/(https):\/{2}\w+\.(com)$/g);//['https://baidu.com']

捕捉的意思:可能通过 RegExp.$1 这种形式捕捉到

  • 和 | 一起应用
'https://baidu.com'.match(/(http|https):\/{2}\w+\.(com|cn)$/g);
//['https://baidu.com']
  • 不捕捉的用法,无奈通过 RegExp.$1 这种形式捕捉到

    'https://baidu.com'.match(/(?:http|https):\/{2}\w+\.(com|cn)$/g);
    //['https://baidu.com']

反斜杠的用法

斜杠:/(大写八字的右边)须要本义,因为正则字面量写法就是两个斜杠
反斜杠:\(大写八字的左边)不须要本义

// 本义特殊字符的作用:'11+2=13'.match(/\d+\+/g); 
//["11+"]
'(11+2)*2=26'.match(/\(\d+\+\d+\)/g); // ["(11+2)"]
// 斜杠须要本义,反斜杠不须要本义:'path C:\Windows\System32'.match(/([a-zA-Z]:\\\w+)/g); 
// null 
'path C:\\Windows\\System32'.match(/([a-zA-Z]:\\\w+)/g); 
// ["C:\\Windows"]
'https://baidu.com'.match(/(http|https):\/\/\w+\.(com|cn)$/g);
//['https://baidu.com']

问号 (?) 的用法

  • (?:n) 示意非捕捉组

      // 不应用括号时
      'adobe12ps15test'.match(/[a-z]+\d+[a-z]+/);
      // ["adobe12ps"]
      // 应用括号分组
      'adobe12ps15test'.match(/[a-z]+(\d+)([a-z]+)/);
      // ["adobe12ps", "12", "ps"]
      'adobe12ps15test'.match(/[a-z]+(?:\d+)([a-z]+)/);
      // ["adobe12ps", "ps"]
      // 看起来下面语句不必 (?:) 也能够失去雷同后果,即:'adobe12ps15test'.match(/[a-z]+\d+([a-z]+)/);
      // ["adobe12ps", "ps"]
    
      // 留神,但需要心愿匹配字母之间的规定简单时,如心愿匹配字母,且字母之间能够为 1 或 3 时,但不须要 1 和 3
      'adobe11ps15test'.match(/[a-z]+(1|3)+([a-z]+)/);
      // ["adobe11ps", "1", "ps"]
      // 返回中不心愿蕴含数字怎么办,能够应用非捕捉
      'adobe11ps15test'.match(/[a-z]+(?:1|3)+([a-z]+)/);
      // ["adobe11ps", "ps"]
  • (?=n) 匹配任何其后紧跟字符 n 的字符串,但返回中不蕴含 n

      'adobe12ps15test'.match(/[a-z]+(?=\d)/g);
      // ["adobe", "ps"]
  • (?!n) 匹配任何其后没有紧跟字符 n 的字符串,返回中不蕴含 n

      'adobe12ps15test'.match(/[a-z]+(?!\d)/g);
      // ["adob", "p", "test"]
  • (?<=n) 匹配任何其前紧跟字符 n 的字符串,返回中不蕴含 n

      'adobe12ps15test'.match(/(?<=\d)[a-z]+/g);
      // ["ps", "test"]
  • (?<!n) 匹配任何其前紧跟字符 n 的字符串,返回中不蕴含 n

      'adobe12ps15test'.match(/(?<!\d)[a-z]+/g);
      // ["adobe", "s", "est"]

运算符优先级

常见正则表达式

1. 由数字、26 个英文字母或者下划线组成的字符串:
    ^[0-9a-zA-Z_]{1,}$ 
2. 非负整数(正整数 + 0):
    ^/d+$
3. 正整数:
    ^[0-9]*[1-9][0-9]*$
4. 非正整数(负整数 + 0):^((-/d+)|(0+))$
5. 负整数 :
    ^-[0-9]*[1-9][0-9]*$
6. 整数:    
    ^-?/d+$
7. 非负浮点数(正浮点数 + 0):
    ^/d+(/./d+)?$
8. 正浮点数 :
    ^(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*))$
9. 非正浮点数(负浮点数 + 0):
    ^((-/d+(/./d+)?)|(0+(/.0+)?))$
10. 负浮点数 :
    ^(-(([0-9]+/.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*/.[0-9]+)|([0-9]*[1-9][0-9]*)))$
11. 浮点数 :
    ^(-?/d+)(/./d+)?$
12. 由 26 个英文字母组成的字符串 :    
    ^[A-Za-z]+$
13. 由 26 个英文字母的大写组成的字符串 :
    ^[A-Z]+$
14. 由 26 个英文字母的小写组成的字符串 :
    ^[a-z]+$
15. 由数字和 26 个英文字母组成的字符串 :
    ^[A-Za-z0-9]+$
16. 由数字、26 个英文字母或者下划线组成的字符串 :    
    ^/w+$
17.email 地址 :
    ^[/w-]+(/.[/w-]+)*@[/w-]+(/.[/w-]+)+$
18.url:    
    ^[a-zA-z]+://(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$
19. 年 - 月 - 日:
    /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/
20. 月 / 日 / 年:
    /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/
21.Emil:
    ^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$
22. 电话号码:
    (d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?
23.IP 地址:
    ^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$
24. 匹配中文字符的正则表达式:[/u4e00-/u9fa5]
25. 匹配双字节字符(包含汉字在内):[^/x00-/xff]
26. 匹配空行的正则表达式:/n[/s|]*/r
27. 匹配 HTML 标记的正则表达式:/<(.*)>.*<///1>|<(.*) //>/
28. 匹配首尾空格的正则表达式:(^/s*)|(/s*$)
29. 匹配 Email 地址的正则表达式:/w+([-+.]/w+)*@/w+([-.]/w+)*/./w+([-.]/w+)*
30. 匹配网址 URL 的正则表达式:^[a-zA-z]+://(//w+(-//w+)*)(//.(//w+(-//w+)*))*(//?//S*)?$
31. 匹配帐号是否非法(字母结尾,容许 5 -16 字节,容许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
32. 匹配国内电话号码:(/d{3}-|/d{4}-)?(/d{8}|/d{7})?
33. 匹配腾讯 QQ 号:^[1-9]*[1-9][0-9]*$
34. 只能输出数字:^[0-9]*$
35. 只能输出 n 位的数字:^/d{n}$
36. 只能输出至多 n 位的数字:^/d{n,}$
37. 只能输出 m~n 位的数字:^/d{m,n}$
38. 只能输出零和非零结尾的数字:^(0|[1-9][0-9]*)$
39. 只能输出有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
40. 只能输出有 1~3 位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
41. 只能输出非零的正整数:^/+?[1-9][0-9]*$
42. 只能输出非零的负整数:^/-[1-9][0-9]*$
43. 只能输出长度为 3 的字符:^.{3}$
44. 只能输出由 26 个英文字母组成的字符串:^[A-Za-z]+$
45. 只能输出由 26 个大写英文字母组成的字符串:^[A-Z]+$
46. 只能输出由 26 个小写英文字母组成的字符串:^[a-z]+$
47. 只能输出由数字和 26 个英文字母组成的字符串:^[A-Za-z0-9]+$
48. 只能输出由数字和 26 个英文字母或者下划线组成的字符串:^/w+$
49. 验证用户明码(正确格局为:以字母结尾,长度在 5~17 之间,只能蕴含字符、数字和下划线)
    ^[a-zA-Z]/w{5,17}$
50. 验证是否蕴含有 ^%&',;=?$/" 等字符:[^%&',;=?$/x22]+
51. 只能输出汉字:^[/u4e00-/u9fa5]{0,}$
52、只含有汉字、数字、字母、下划线不能以下划线结尾和结尾
    ^(?!_)(?!.*?_$)[a-zA-Z0-9_/u4e00-/u9fa5]+$
53、只含有汉字、数字、字母、下划线,下划线地位不限
    ^[a-zA-Z0-9_/u4e00-/u9fa5]+$
54、2~4 个汉字
    @"^[/u4E00-/u9FA5]{2,4}$

参考学习材料:
https://cloud.tencent.com/dev…
https://www.runoob.com/regexp…


  1. A-Za-z0-9_ ↩

正文完
 0