吃通 正则表达式regexp

Posted 一口Linux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了吃通 正则表达式regexp相关的知识,希望对你有一定的参考价值。

正则表达式(在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个规则的字符串搜索模式。

吃通 正则表达式regexp

 

引用:
https://houdunren.gitee.io/note/js/14%20%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.html#%E5%88%9B%E5%BB%BA%E6%AD%A3%E5%88%99

replace() 方法使用正则表达式

var str = "Visit Microsoft!"; 
var txt = str.replace(/microsoft/i,"Runoob"); //txt 输出为:Visit Runoob!

正则表达式修饰符

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

修饰符

描述

/i

执行对大小写不敏感的匹配。

/g

执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。

/m

执行多行匹配。

/s

使用/s 视为单行模式(忽略换行)

正则表达式模式(选择符)

方括号用于查找某个范围内的字符:

表达式

描述

[abc]

查找方括号之间的任何字符。

[0-9]

查找任何从 0 至 9 的数字。

(x|y)

查找任何以 | 分隔的选项。

[a-z]

匹配小写a-z任何一个字母

[A-Z]

匹配大写A_Z任何一个字母

[^]

只匹配“除了”其中字符的任意一个原子

元字符是拥有特殊含义的字符:

. 匹配除换行符(\\n)以外的任意字符 ,如果需要.可以用转义字符 \\.
[] 匹配[]中列举的字符

\\w 匹配字母或数字或下划线或汉字 即a-z、A-Z、0-9、_、汉字。
\\W 匹配特殊字符,即非字母、非数字、非汉字、非_

\\s 匹配任意的空白符,即空格,tab键
\\S 匹配非空白

\\d 匹配数字,即0-9
\\D 匹配非数字,即不是数字

\\b 匹配单词的开始或结束

^ 匹配字符串的开始

$ 匹配字符串的结束

实例

var hd="张三:012-123456,李四:020-9999999";
var res=hd.match(/[^-\\d:,]+/g);// ["张三", "李四"]
//^ 非

//实例 2
var em="lifangfang@saikr.com"
em.match(/^\\w+@\\w+\\.\\w+$/);

//实例3
var xx="栈单:12222,;芳芳:eeeee";
xx.match(/\\p{sc=Han}+/gu);//["栈单", "芳芳"] 找中文\\p{sc=Han}和gu的配合使用
xx.match(/[^\\d:\\-,;\\w]+/g);//["栈单", "芳芳"]

//实际例子
str.match(/\\p{P}/gu);//匹配标点符号

量词:

量词

描述

n+

匹配任何包含至少一个 n 的字符串。(1个或多个

n*

匹配任何包含零个或多个 n 的字符串。(0个或多个

n?

匹配任何包含零个或一个 n 的字符串。(0个或1个

{n}

重复n次

{n,}

重复n次或更多次

{n,m}

重复n到m次

test()

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

//以下实例用于搜索字符串中的字符‘e’
var patt = /e/;// ** //是字面量创建正则表达式的形式
patt.test("The best things in life are free!");

//因为字符串中含有e,所以该实例输出为:true

match()

字符转义

转义用于改变字符的含义,用来对某个字符有多种语义时的处理。

假如有这样的场景,如果我们想通过正则查找/符号,但是 /在正则中有特殊的意义。如果写成///这会造成解析错误,所以要使用转义语法 /\\//来匹配。

const url = "https://www.houdunren.com";
console.log(/https:\\/\\//.test(url)); //true

//使用 RegExp 构建正则时在转义上会有些区别,下面是对象与字面量定义正则时区别
let price = 12.23;
//含义1: . 除换行外任何字符 	含义2: .普通点
//含义1: d 字母d   					含义2: \\d 数字 0~9
console.log(/\\d+\\.\\d+/.test(price));

//字符串中 \\d 与 d 是一样的,所以在 new RegExp 时\\d 即为 d
console.log("\\d" == "d");

//使用对象定义正则时,可以先把字符串打印一样,结果是字面量一样的定义就对了
console.log("\\\\d+\\\\.\\\\d+");
let reg = new RegExp("\\\\d+\\\\.\\\\d+");
console.log(reg.test(price));

!!!进阶

禁止贪婪

正则表达式在进行重复匹配时,默认是贪婪匹配模式,也就是说会尽量匹配更多内容,但是有的时候我们并不希望他匹配更多内容,这时可以通过?进行修饰来禁止重复匹配

使用

说明

*?

重复任意次,但尽可能少重复

+?

重复1次或更多次,但尽可能少重复

??

重复0次或1次,但尽可能少重复

{n,m}?

重复n到m次,但尽可能少重复

{n,}?

重复n次以上,但尽可能少重复

下面是禁止贪婪的语法例子

let str = "aaa";
console.log(str.match(/a+/)); //aaa
console.log(str.match(/a+?/)); //a
console.log(str.match(/a{2,3}?/)); //aa
console.log(str.match(/a{2,}?/)); //aa

以上是关于吃通 正则表达式regexp的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式(RegExp)

MySQL正则表达式 REGEXP详解

MySQL正则表达式 REGEXP详解

系统认识JavaScript正则表达式

攻破难啃的骨头-正则表达式(转)

js正则表达式总结