资讯专栏INFORMATION COLUMN

正则表达式(一)

Ajian / 3280人阅读

摘要:基本概念正则表达式是一种文本模式,包括普通字符例如,到之间的字母和特殊字符称为元字符。所以还要对正则的启始位置进行限制第一部分简单回顾了正则表达式的基础知识,下一部分重点介绍正则的分组语法和常用方法

前言

正则表达式在编码中会经常使用到,但是平时只是需要的时候就去看看。往往看到那些元字符、量词就直接跳过,直接百度了,一直没有很深入的去了解,现在有时间就简单总结一下。

基本概念

正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。

正则使用场景:

1. 检查文本中是否含有指定的特征词
2. 找出文中匹配特征词的位置
3. 从文本中提取信息,比如:字符串的子串
4. 修改文本
元字符

元字符是在正则表达式中你有特殊含义的非字母字符。元字符必须转义

( ) [ ] { } ^ $ | ? * + .

修饰符

g: global,全文搜索,如果不添加,搜索到第一个匹配就停止。

i: ignore case,忽略大小写,默认大小写敏感。

m: mutiple lines,多行搜索

字符类匹配
字符 匹配
[...] 匹配方括号内的任意字符 例如[abcd]
[^ x ] 匹配除了x以外的任意字符 例如 [^abcd] 匹配除了abcd以外的任意字符
. 匹配除了换行符
s 匹配任意的空白符
S 匹配任意不是空白符的字符
w 匹配字母或者数字、下划线、汉字 等价于[a-zA-Z0-9]
W 匹配不是字母或者数字、下划线、汉字
d 匹配任意数字
D 匹配任意非数字的字符
 匹配单词的开始或者结束的位置
重复字符匹配
字符 匹配
{n,m} 匹配前一项至少n次,但不能超过m次
{n,} 匹配前一项n次或更多次
{n} 匹配前一项n次
匹配前一项0次或者1次,也就是说前一项是可选的,等价于{0,1}
+ 匹配前一项1次或多次,等价于{1,}
* 匹配前一项0次或多次,等价于{0,}
字符类:锚字符 匹配
元字符/元符号 匹配
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
A 只有匹配字符串开始处
b 匹配单词边界,词在 []内时无效
B 匹配非单词边界
G 匹配当前搜索的开始位置
 匹配字符串结束处或行尾
z 只匹配字符串结束处
字符类:记录字符 匹配
元字符/元符号 匹配情况
(string) 用于反向引用的分组
1 或$1 匹配第一个分组中的内容
2 或$2 匹配第二个分组中的内容
3 或$3 匹配第三个分组中的内容
正则表达式修饰符
字符      含义
i        执行不区分大小写的匹配
g        执行一个全局匹配,即找到所有匹配而非一次匹配
m        多行匹配模式,^匹配一行的开头和字符串开头,$匹配行的结束和字符串的结尾

构造方式

1.字面量

var pattern = /is/g;
 

eg:var reg1=/hello world (w*)/gi;

2.构造函数

var pattern = new RegExp("is", "g");

new RegExp("正则表格式字符串",正则表达式修饰符);

注意⚠️: 因为构造函数中使用的是字符串,由于字符串转义问题,""代表""。
RegExp对象方法

RegExp对象给我们提供了三种方法供我们使用,分别是test()、exec()和compile()。下面具体说一下这三个方法的用处。

1.test()

检索字符串中指定的值。返回 true 或 false。这个是我们平时最常用的方法。

 var reg=/hello w{3,12}/;
 alert(reg.test("hello js"));//false
 alert(reg.test("hello javascript"));//true

2.exec()

检索字符串中指定的值。匹配成功返回一个数组,匹配失败返回null。

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

3.compile()

compile() 方法用于改变 RegExp。
compile() 既可以改变检索模式,也可以添加或删除第二个参数。

var reg=/hello/;
console.log(reg.exec("hellojs"));//["hello"]
reg.compile("Hello");
console.log(reg.exec("hellojs"));//null
reg.compile("Hello","i");
console.log(reg.exec("hellojs"));//["hello"]  
举几个例子

1.匹配下面的电话号码:

     1. (010)88886666  
     2.  022-22334455  
     3.  02912345678

 /(?0d{2}[)-]?d{8}/;
 

验证如下

var regex = /(?0d{2}[)-]?d{8}/;
regex.test(" 02912345678")
regex.test(" 022-22334455")
regex.test("(010)88886666")
true

2.匹配ip地址
IP地址格式可表示为:XXX.XXX.XXX.XXX,XXX取值范围是0-255,前三段加一个.重复了三次,在与最后一段合并及组成IP地址的完整格式。
最简单的写法 /([0-9]{1,3}.){3}[0-9]{1,3}/
但是这样会匹配到很多无效的ip xxx的范围超过255.
所以对这个写法进行改进

当xxx只有一位的时候 取值的范围是[1-9] 可以表示为[1-9]

当xxx为两位时 取值范围为[0-99] 可以表示为 [1-9]d

当xxx为三位数时最高位取值为1 取值范围为[100 - 199] 可以表示为[1]d{2}
最高位取值为2 第二位不超过5时 取值范围为[200 - 249] 可以表示为2[0-4]d
最高位取值为2,十位取值5,个位取值0-5 取值范围为 [250 - 255] 表示为 25[0-5]

将这三种情况合并可以表示(25[0-5]|2[0-4]d|((1d{2})|([1-9]?d)))

整个ip的正则可以表示为
((25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))).){3}(25[0-5]|2[0-4]d|((1d{2})|([1-9]?d)))
但是这还存在问题 现在只要字符串中有一部分能够通过校验test就会返回true 例如2313.2.3.4。

var regex = /((25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))).){3}(25[0-5]|2[0-4]d|((1d{2})|([1-9]?d)))/;
regex.test("3424.2.3.2");
true

所以还要对正则的启始位置进行限制

var regex = /^((25[0-5]|2[0-4]d|((1d{2})|([1-9]?d))).){3}(25[0-5]|2[0-4]d|((1d{2})|([1-9]?d)))$/;
regex.test("3424.2.3.2");
false

第一部分简单回顾了正则表达式的基础知识,下一部分重点介绍正则的分组语法 和 常用方法

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90001.html

相关文章

  • 正则达式

    摘要:本文内容共正则表达式火拼系列正则表达式回溯法原理学习正则表达式,是需要懂点儿匹配原理的。正则表达式迷你书问世了让帮你生成和解析参数字符串最全正则表达式总结验证号手机号中文邮编身份证地址等是正则表达式的缩写,作用是对字符串执行模式匹配。 JS 的正则表达式 正则表达式 一种几乎可以在所有的程序设计语言里和所有的计算机平台上使用的文字处理工具。它可以用来查找特定的信息(搜索),也可以用来查...

    bang590 评论0 收藏0
  • JavaScript正则达式的匹配模式

    摘要:选择分组和引用正则表达式的语法还包括指定选择项子表达式分组和引用前一子表达式的特殊字符。带圆括号的表达式的另一个用途是允许在同一正则表达式的后部引用前面的子表达式。 正则表达式(regular expression)是一个描述字符模式的对象。JavaScript的 RegExp类 表示正则表达式,String和RegExp都定义了方法,后者使用正则表达式进 行强大的模式匹配和文本检索与...

    wqj97 评论0 收藏0
  • JS正则达式条龙讲解,从原理和语法到JS正则、ES6正则扩展,最后再到正则实践思路

    摘要:控制权和传动这两个词可能在搜一些博文或者资料的时候会遇到,这里做一个解释先控制权是指哪一个正则子表达式可能为一个普通字符元字符或元字符序列组成在匹配字符串,那么控制权就在哪。 温馨提示:文章很长很长,保持耐心,必要时可以跳着看,当然用来查也是不错的。 正则啊,就像一座灯塔,当你在字符串的海洋不知所措的时候,总能给你一点思路;正则啊,就像一台验钞机,在你不知道用户提交的钞票真假的时候,...

    Michael_Lin 评论0 收藏0
  • Python正则达式很难?篇文章搞定他,不是我吹!

    摘要:正则表达式语法字符与字符类特殊字符以上特殊字符要想使用字面值,必须使用进行转义字符类包含在中的一个或者多个字符被称为字符类,字符类在匹配时如果没有指定量词则只会匹配其中的一个。 1. 正则表达式语法 1.1 字符与字符类 1 特殊字符:.^$?+*{}| 以上特殊字符要想使用字面值,必须使用进行转义 2 字符类 1. 包含在[]中的一个或者多个字符被称为字符类,字符类在匹配时如果没有指...

    dcr309duan 评论0 收藏0
  • JavaScript正则达式RegExp

    摘要:的正则表达式体系是参照建立的。字面量形式构造函数形式以上都是创建了一个内容为的正则表达式,其表示对一个手机号码的校验。按照给定的正则表达式进行替换,返回替换后的字符串。 正则表达式,也称规则表达式,经常使用其来完成对字符串的校验和过滤。由于正则表达式的灵活性、逻辑性和功能性都非常强大,而且 可以利用很简单的方式完成对复杂字符串的控制,所以很多程序语言都支持正则表达式。在JavaScri...

    SexySix 评论0 收藏0
  • JavaScript 中的正则达式

    摘要:正则表达式的意义中的正则表达式使用表示,可以使用构造函数来创建对象,不过对象更多的是通过一种特殊的直接量语法来创建。用构造函数也可以定义一个与之等价的正则表达式,代码如下正则表达式的模式规则是由一个字符序列组成的。 正则表达式的模式匹配 正则表达式(regular expression)是一个描述字符模式的对象。javascript的RegExp对象表示正则表达式,String和Reg...

    _Dreams 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<