吃通 正则表达式regexp
Posted 一口Linux
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了吃通 正则表达式regexp相关的知识,希望对你有一定的参考价值。
正则表达式(在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个规则的字符串搜索模式。
引用:
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的主要内容,如果未能解决你的问题,请参考以下文章