字符串高效的、能复用的、简练的操作:RegExp(正则表达式)
发布日期:2021-06-29 11:42:56 浏览次数:2 分类:技术文章

本文共 3725 字,大约阅读时间需要 12 分钟。

字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在。比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦,而且代码难以复用

'use strict';验证Email地址的正则表达式var re1 = /^[0-9a-zA-Z\.]+@[0-9a-z]+\.[0-9a-z]+$/;验证并提取出带名字的Email地址的正则表达式var re2 = =/^\<([\w\s\w]+)\>\s+([0-9a-zA-Z\.]+@[0-9a-zA-Z]+\.[a-zA-Z]+)$/;测试re1:var    i,    success = true,    should_pass = ['someone@gmail.com', 'bill.gates@microsoft.com', 'tom@voyager.org', 'bob2015@163.com'],    should_fail = ['test#gmail.com', 'bill@microsoft', 'bill%gates@ms.com', '@voyager.org'];for (i = 0; i < should_pass.length; i++) {    if (!re.test(should_pass[i])) {        console.log('测试失败: ' + should_pass[i]);        success = false;        break;    }}for (i = 0; i < should_fail.length; i++) {    if (re.test(should_fail[i])) {        console.log('测试失败: ' + should_fail[i]);        success = false;        break;    }}if (success) {    console.log('测试通过!');}测试re2:var r = re.exec('
tom@voyager.org');if (r === null || r.toString() !== ['
tom@voyager.org', 'Tom Paris', 'tom@voyager.org'].toString()) { console.log('测试失败!');}else { console.log('测试成功!');}

正则表达式是一种用来匹配字符串的强有力的武器。它的设计思想是用一种描述性的语言来给字符串定义一个规则,凡是符合规则的字符串,我们就认为它“匹配”了,否则,该字符串就是不合法的。

正则表达式也是用字符串表示的,所以,要首先了解如何用字符来描述字符

创建正则表达式对象的语法如下:

  • var patt=new RegExp(pattern,modifiers);
  • var patt=/pattern/modifiers;
  • pattern(模式) 描述了表达式的模式
  • modifiers(修饰符) 用于指定全局匹配、区分大小写的匹配和多行匹配
var r11 = /test/g;// 等价于:var r12 = new RegExp('test', 'g');var r21 = /^(\d+)(0*)$/;// 等价于:var r22 = new RegExp('^(\\d+)(0*)$');  //注意\d是正则语法,\d在字符串里面就是显示的是d,并不会显示\,需要使用转义字符

在正则表达式中,如果直接给出字符,就是精确匹配。元字符指的是拥有特殊含义的字符:用\d可以匹配一个数字,\w可以匹配一个字母或数字, .可以匹配任意字符,如果要匹配点号本身,则需要转义\.。

匹配变长的字符,在正则表达式中,就是量词。用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示至少n次,最多m次匹配。

'00\d'可以匹配'007',但无法匹配'00A';    '\d\d\d'可以匹配'010';    '\w\w'可以匹配'js';    'js.'可以匹配'jsp'、'jss'、'js!'等等。    \d{3}\s+\d{3,8}        从左到右解读一下:        \d{3}表示匹配3个数字,例如'010';        \s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配' ','\t\t'等;        \d{3,8}表示3-8个数字,例如'1234567'。

 复杂的匹配方式:

如果要匹配'010-12345'这样的号码,所以,上面的正则是\d{3}-\d{3,8}。但是,仍然无法匹配'010 - 12345',因为带有空格。所以我们需要更复杂的匹配方式。

要做更精确地匹配,可以用方括号[]表示查找范围。使用小括号()表示要匹配的整体字符串即分组。使用大括号{}表示量词。A|B表示可以匹配单个字符AB,那么(red|green|blue)表示匹配整体red字符串或者green或者blue。

[0-9a-zA-Z\_]可以匹配一个数字、字母或者下划线;    [0-9a-zA-Z\_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如'a100','0_Z','js2015'等等;    [a-zA-Z\_\$][0-9a-zA-Z\_\$]*可以匹配由字母或下划线、$开头,后接任意个由一个数字、字母或者下划线、$组成的字符串,也就是JavaScript允许的变量名;    [a-zA-Z\_\$][0-9a-zA-Z\_\$]{0, 19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。    (J|j)ava(S|s)cript可以匹配'JavaScript'、'Javascript'、'javaScript'或者'javascript'因为(red|blue|green) 查找任何指定的选项。

 正则表达式对象的方法:

test() 方法是一个正则表达式方法:它通过模式来搜索字符串,用于测试给定的字符串是否符合条件然后根据结果返回 true 或 false。

var patt = /e/;patt.test("The best things in life are free!"); //返回truevar re = /^\d{3}\-\d{3,8}$/;re.test('010-12345'); // truere.test('010-1234x'); // falsere.test('010 12345'); // false不必首先把正则表达式放入变量中,可缩短为一行/e/.test("The best things in life are free!");  // true/^\d{3}\-\d{3,8}$/.test('010-12345');  // true

exec() 方法是一个正则表达式方法:它通过指定的模式(pattern)搜索字符串,并返回已找到的文本。注意:exec()方法在匹配成功后,会返回一个Array,第一个元素是正则表达式匹配到的整个字符串,后面的字符串表示匹配成功的子串(如果使用了分组符号)。exec()方法在匹配失败时返回null

var re = /^(\d{3})-(\d{3,8})$/;  // 分别定义了两个组,可以直接从匹配的字符串中提取出区号和本地号码re.exec('010-12345'); // ['010-12345', '010', '12345'],使用分组符号会返回分组字符串/^\d{3}-\d{3,8}$/.exec('010-12345');  // ['010-123456']re.exec('010 12345'); // null

正则匹配默认是贪婪匹配,也就是匹配尽可能多的字符。

var re = /^(\d+)(0*)$/;re.exec('102300'); // ['102300', '102300', ''] 由于\d+采用贪婪匹配,直接把后面的0全部匹配了,结果0*只能匹配空字符串了。var re = /^(\d+?)(0*)$/;  // 必须让\d+采用非贪婪匹配(也就是尽可能少匹配),才能把后面的0匹配出来,加个?就可以让\d+采用非贪婪匹配:re.exec('102300'); // ['102300', '1023', '00']

 上述说明了RegExp对象的属性和方法。一般情况下,正则表达式常用于字符串的函数中用来匹配,那么支持支持正则表达式的字符串方法有:通常搭配使用修饰符g

转载地址:https://blog.csdn.net/zz2230633069/article/details/108252411 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:JSON:一种速度快的,标准的,序列化的数据交换格式(字符串)
下一篇:Date对象的创建方式和具有的方法,时间戳的概念,时间戳转换成Date对象

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月15日 05时08分06秒