学习笔记-正则表达式[通俗易懂]

学习笔记-正则表达式[通俗易懂]学习笔记-正则表达式

大家好,又见面了,我是你们的朋友全栈君。

参考 

1.MDN正则表达式 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions 2.https://www.cnblogs.com/tugenhua0707/p/5037811.html

1 创建一个正则表达式

两种方法 

方法1:使用一个正则表达式字面量,其由包含在斜杠之间的模式组成

const regex1 = /ab+c/; 
const regex2 = /^[a-zA-Z]+[0-9]*\W?_$/gi;
复制代码

方法2:调用RegExp对象的构造函数

var regex1 = new RegExp("ab+c");
var regex2 = new RegExp(/^[a-zA-Z]+[0-9]*\W?_$/, "gi");
var regex3 = new RegExp("^[a-zA-Z]+[0-9]*\\W?_$", "gi");
复制代码

2 支持正则表达式的String对象的方法

2.1 search()

用法:执行正则表达式和 String对象之间的一个搜索匹配 

语法:str.search(regexp) 

返回值:如果匹配成功,返回正则表达式在字符串中首次匹配项的索引。否则,返回 -1。

例:

var str = 'hello world,hello world'
console.log(str.search(/hello/)) // 0
console.log(str.search('world')) // 6
console.log(str.search(/123/))  // -1
复制代码

2.2 match()

用法:当一个字符串与一个正则表达式匹配时, match()方法检索匹配项 

语法:str.match(regexp) 

返回值:如果字符串匹配到了表达式,会返回一个数组,数组的第一项是进行匹配完整的字符串,之后的项是用圆括号捕获的结果。如果没有匹配到,返回null。

例:

var str = "hello world"
console.log(str.match("hello")) // ["hello", index: 0, input: "hello world", groups: undefined]
console.log(str.match("Hello")) // null
console.log(str.match(/hello/)) // ["hello", index: 0, input: "hello world", groups: undefined]
// 全局匹配
var str2="1 plus 2 equal 3"
console.log(str2.match(/\d+/g)); //["1", "2", "3"]
复制代码

2.3 replace() 

用法:返回一个由替换值替换一些或所有匹配的模式后的新字符串。模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数。 

语法:str.replace(regexp|substr, newSubStr|function) 

例: 

var str = "hello world";
// 替换字符串
var s1 = str.replace("hello","a");
console.log(s1);// a world
// 使用正则替换字符串
var s2 = str.replace(/hello/,"b");
console.log(s2); // b world

// 使用正则全局替换 字符串
var s3 = str.replace(/l/g,'');
console.log(s3); // heo word

// $1,$2 代表的是第一个和第二个子表达式相匹配的文本
// 子表达式需要使用小括号括起来,代表的含义是分组
var name = "xiao,yao";
var s4 = name.replace(/(\w+)\s*,\s*(\w+)/,"$2 $1");
console.log(s4); // "yao,xiao"
// $& 是与RegExp相匹配的子字符串
var name = "hello I am a chinese people";
var regexp = /am/g;
if(regexp.test(name)) {
    //返回正则表达式匹配项的字符串
    console.log(RegExp['$&']);  // am

    //返回被搜索的字符串中从最后一个匹配位置开始到字符串结尾之间的字符。
    console.log(RegExp["$'"]); // a chinese people

    //返回被查找的字符串从字符串开始的位置到最后匹配之前的位置之间的字符。
    console.log(RegExp['$`']);  // hello I 
    
    // 返回任何正则表达式查找过程中最后括号的子匹配。
    console.log(RegExp['$+']); // 空字符串

    //返回任何正则表达式搜索过程中的最后匹配的字符。
    console.log(RegExp['$_']);  // hello I am a chinese people
}

// replace 第二个参数也可以是一个function 函数
var name2 = "123sdasadsr44565dffghg987gff33234";
name2.replace(/\d+/g,function(v){
    console.log(v); 
    /*
     * 第一次打印123
     * 第二次打印44565
     * 第三次打印987
     * 第四次打印 33234
     */
});
/*
 * 如下函数,回调函数参数一共有四个
 * 第一个参数的含义是 匹配的字符串
 * 第二个参数的含义是 正则表达式分组内容,没有分组的话,就没有该参数,
 * 如果没有该参数的话那么第四个参数就是undefined
 * 第三个参数的含义是 匹配项在字符串中的索引index
 * 第四个参数的含义是 原字符串
 */
 name2.replace(/(\d+)/g,function(a,b,c,d){
    console.log(a);
    console.log(b);
    console.log(c);
    console.log(d);
    /*
     * 如上会执行四次,值分别如下(正则使用小括号,代表分组):
     * 第一次: 123,123,0,123sdasadsr44565dffghg987gff33234
     * 第二次: 44565,44565,11,123sdasadsr44565dffghg987gff33234
     * 第三次: 987,987,22,123sdasadsr44565dffghg987gff33234
     * 第四次: 33234,33234,28,123sdasadsr44565dffghg987gff33234
     */
 });
复制代码

2.4 split()

作用:使用指定的分隔符字符串将一个String对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。

语法:str.split([separator[, limit]])

例:

var str = "what are you doing?";
// 以" "分割字符串
console.log(str.split(" "));
// 打印 ["what", "are", "you", "doing?"]

// 以 "" 分割字符串
console.log(str.split(""));
/*
 * 打印:["w", "h", "a", "t", " ", "a", "r", "e", " ", "y", "o", "u", " ", "d", "o", "i", "n", 
 * "g", "?"]
 */
// 指定返回数组的最大长度为3
console.log(str.split("",3));
// 打印 ["w", "h", "a"]
复制代码

3 RegExp对象方法

3.1 test()

作用:执行一个检索,用来查看正则表达式与指定的字符串是否匹配。返回 true 或 false。 

语法:regexObj.test(str) 返回:如果正则表达式与指定的字符串匹配 ,返回true;否则false。

例:

let str = "xiao and yao";
console.log(/xiao/.test(str)); // true
console.log(/xiaoxiao/.test(str)); //false

// 或者创建RegExp对象模式
let regexp = new RegExp("xiao");
console.log(regexp.test(str)); // true
复制代码

3.2 exec()

作用:在一个指定字符串中执行一个搜索匹配。 

语法:regexObj.exec(str) 

返回:如果匹配成功,返回一个数组,并更新正则表达式对象的属性。返回的数组将完全匹配成功的文本作为第一项,将正则括号里匹配成功的作为数组填充到后面。 如果匹配失败,exec() 方法返回 null。

例:

let str = "xiao and yao";
console.log(/xiao/.exec(str)); 
// ["xiao", index: 0, input: "xiao and yao", groups: undefined]

console.log(/wo/.exec(str)); // null
复制代码

4 正则表达式实战

4.1 匹配以数字结尾的正则

正则:/\d+$/g

4.2 去掉空格

let str = "我 是 肖 瑶"
console.log(str)    // 我 是 肖 瑶
console.log(str.replace(/\s+/g,'')) // 我是肖瑶
复制代码

4.3 判断字符串是不是由数字组成

let str1 = "1234xixihaha"
let str2 = "7788"
let reg = /^\d*$/

console.log(reg.test(str1))     // false
console.log(reg.test(str2))     // true
复制代码

4.4 电话号码

分析如下: 

组成:区号-电话号码 或 区号-电话号码-分机号 

区号正则:/\d{3,4}/ 

电话号码:/\d{7,8}/ 

分机号:/\d{3,4}/ 

完整的电话号码正则:/^\d{3,4}-\d{7,8}(-\d{3,4})?$/

4.5 手机号码

let str1 = "18688666688"
let str2 = "1234567890"
let reg = /^1[3|4|5|7|8][0-9]{9}$/
console.log(reg.test(str1)) // true
console.log(reg.test(str2)) // false
复制代码

4.6 删除字符串左右空格

let reg = /^\s+|\s+$/g
let str1 = "123 "
let str2 = " 123"
let str3 = " 123 "
console.log(str1.replace(reg,''))
console.log(str2.replace(reg,''))
复制代码

4.7 限制文本框只能输入整数或小数(二位小数)

let reg = /^\d*\.?\d{0,2}$/
let str1 = .9
let str2 = 1.99
let str3 = "1a.99"

console.log(reg.test(str1)) // true
console.log(reg.test(str2)) // true
console.log(reg.test(str3)) // false
复制代码

4.8 匹配中文的正则

使用 Unicode

let reg = /[\u4E00-\u9FA5\uf900-\ufa2d]/g
console.log(reg.test("我是")) //true
console.log(reg.test("aa"))     // false
复制代码

4.9 返回字符串中 中文字符的个数

分析: 使用replace方法把不是中文字符全部替换成空,返回被替换的字符,都是中文字符,计算长度

let str = "aaa肖瑶bbb嘻嘻哈哈111"
let reg = /[^\u4E00-\u9FA5\uf900-\ufa2d]/g

let strChange = str.replace(reg,'')
console.log(strChange)      // 肖瑶嘻嘻哈哈
console.log(strChange.length)   // 6
复制代码

4.9 IP地址

let reg = /^\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}$/
复制代码

4.10 匹配标签中的内容

比如匹配如代码 <ul><li>aaa</li><li>bbb</li></ul> 

分析:想获取ul中的内容,可以对匹配的内容使用分组 [\s\S]+ 空白和非空白字符

let str1 = "<ul><li>aaa</li><li>bbb</li></ul>"
let reg = /<ul>([\s\S]+)<\/ul>/g
str1.match(reg)
console.log(RegExp.$1)  // <li>aaa</li><li>bbb</li>
复制代码

4.11 身份证号码的匹配

匹配规则:身份证号码有15位或者18位,其中最后一位可能是X,其他全是数字

let reg = /^(\d{14}|\d{17})(\d|[xX])$/
let identity1 = "430304199701012787"
let identity2 = "43030419970101278X"
let identity3 = "43030419970101278a"

console.log(reg.test(identity1))    // true
console.log(reg.test(identity2))    // true
console.log(reg.test(identity3))    // false
复制代码

4.12 IP地址

let reg = /^\d{1-3}\.\d{1-3}\.\d{1-3}\.\d{1-3}$/
复制代码

4.13 邮箱的正则表达式

/^([a-zA-Z_0-9-])+@([a-zA-Z_0-9-])+(\.[a-zA-Z_0-9-])+$/
复制代码

5 结语

文章若有错误,还望指正。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107311.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【转载】谢孟媛_初级英文文法_讲义!全!!

    【转载】谢孟媛_初级英文文法_讲义!全!!初级英文文法ⅠUnit1名词、冠词———————1名词的种类名词的数名词的所有格冠词Unit2be动词、一般动词的现在式——————–

    2022年7月1日
    24
  • 【详细教程·本人亲测】解决win10家庭版系统C:\Users用户名中有中文,更改为英文的问题

    【详细教程·本人亲测】解决win10家庭版系统C:\Users用户名中有中文,更改为英文的问题【本人亲测】解决win10家庭版系统C:\Users用户名更改的问题【前言】新电脑刚买来,自带win10系统,激活时注册用户名和密码,为了方便记忆把用户名设为中文。随着后来学习和工作软件越装越多,在学习软件开发才发现Users必须为英文,此时重装系统成本极大!因此本人花了大量时间在网上寻找解决方案。但是基本上不适合win10家庭版。终于最后搜到一个方案解决,深知不易,特分享给各位。<第一…

    2022年5月30日
    46
  • awvs14安装教程_awvs官网

    awvs14安装教程_awvs官网目录0x00前言0x01AWVS14.5更新内容1、更新2、修复0x02AWVS安装1、解压后双击打开AcunetixPremiumv14.5.211026108.exe2、选一个中意的安装位置和数据存放位置,将它埋下3、建一个自己的AWVS登录账号,不需要真实的账户4、更改AWVS连接端口号,笔者直接默认5、安装AWVS途中安装证书6、成功安装0x03AWVS激活1、管理员权限打开AcunetixPremiumActivationT

    2022年9月22日
    4
  • 《Python数据分析项目案例》猪肉(生猪)价格爬取与可视化分析(期末大作业、课程设计、毕业设计)

    《Python数据分析项目案例》猪肉(生猪)价格爬取与可视化分析(期末大作业、课程设计、毕业设计)Python数据分析、数据挖掘程序设计(期末结课大作业、课程设计、毕业设计)基于python语言的生猪价格爬取与可视化分析,Python大作业,数据分析与挖掘大作业。长文,多图预警,建议先收藏,后阅读。需要工程代码可直接阅读文末。

    2022年10月2日
    4
  • springboot事物oracle,SpringBoot 事务管理

    springboot事物oracle,SpringBoot 事务管理事务管理是项目中必不可少的一部分,使用SpringBoot时,可以很方便的配置和使用事务管理器。1.导入依赖当导入jdbc或者jpa依赖后,SpringBoot会自动分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何配置就可以使用@Transactional注解来进行事务的使用。我习惯使用jdbc,虽然Jpa有各种…

    2022年5月29日
    36
  • 简单的12864显示程序

    简单的12864显示程序12864

    2022年7月2日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号