- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章常用正则表达式知识点解读及判读有效数字、手机号邮箱正则表达式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、正则仅仅就是用来处理字符串的:匹配、捕获 。
匹配:验证当前的字符串是否符合我们的规则(每一个正则都是一个规则) 捕获:在整个字符串当中,把符合规则的字符都依次的获取到--->exec、match、replace 。
2、正则的组成:元字符、修饰符 。
元字符:
特殊意义的元字符:
\d匹配一个0-9的数字相当于[0-9],和它相反的 \D匹配一个除了0-9的任意字符相当于【】 \w匹配一个0-9、a-z、A-Z_ 的数字或字符,相当于[0-9a-zA-Z_] 、 \s匹配一个空白字符(空格、制表符。。。) \b匹配一个单词的边界 “w100 w000” \t匹配一个制表符 \n匹配一个换行 . 匹配一个除了\n以外的任意字符 ^ 以某一个元字符开头 $ 以某一个元字符结尾 \ 转译字符 x|y x或者y的一个 [xyz] x、y、z、中的任意一个 [^xyz]除了x、y、z、中的任意一个 [a-z] -> 匹配a-z中的任意一个字符 [^a-z] -> 匹配除了a-z中的任意一个字符 () 正则中的分组 。
量词:
* 0到多个 + 1到多个 ? 0到1个 。
?在正则中的意义比较多 。
放在一个非量词元字符后面代表出现0-1次 例如/^\d?$/出现0-9直接的数0到1次 。
放在一个量词元字符后面,取消捕获时候的贪婪性 /^\d+?$/捕获的时候只是把第一个捕获的数字获取 "2015"--->2 (?:)分组值匹配不捕获 (?=)正向预查 (?!)负向预查 。
()的作用 1)改变默认的优先级 2)可以进行分组捕获 3)分组引用 。
{n}出现n次 {n,}出现n到多次 {n,m}出现n到m次 。
普通元字符 。
任何字符在正则中除了以上有特殊意义的,其他的都是代表本身意思的普通元字符 。
修饰符:
i:忽略字母的大小写 m:multiline 多行匹配 g:global全局匹配 。
项目中经常使用的正则 。
1)判断是有效数字的正则 。
有效数字是指:正数、负数、零、小数 。
第一部分:可能出现加减或者没有 第二部分:一位数可以是0,多位数不能以0开头 第三部分:可以有小数也可以没有小数,但是一旦出现小数点,后面至少跟一位数字 var reg =/^[+-]?(\d|[1-9]\d+)(\.\d+)?$/,
有效的正整数(包含0):/^[+]?(\d|[1-9]\d+)$/,
有效的负整数(包含0):/^-(\d|[1-9]\d+)$/,
判断手机号(简单版): var reg=/^1\d{10}$/,
判断邮箱 第一部分:数字、字母、下划线、- 一到多位 第二部分:@ 第三部分:数字、字母、 一到多位 第四部分:(.两到四位) .com .cn .net .. .com.cn var reg =/^[0-9a-zA-Z_-]+@[0-9a-zA-Z-]+(\.[a-zA-Z]{2,4}){1,2}$/ 。
判断年龄在18到65之间的 18-19/20-59/60-65 var reg =/^((18|19)|([2-5]\d)|(6[0-5]))$/ 。
真实有效的中华人民共和国姓名 2-4 位汉字 var reg = /^[\u4e00-\u9fa5]{2,4}$/,
身份证号码 前六位是省->市->县(区) 四位年 两位月 两位日 。
简单版 。
var reg = /^\d{17}(\d|X)$/; 130828199012040617 。
复杂版 。
var reg = /^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(?:\d{2})(\d)(?:\d|X)$/,
细节知识点 。
里面出现的任何字符都是代表本身意义的,例如:[.]中的”.“就是代表一个小数点而不是除了\n以外的任意字符 里面出现18不是数字18而是1或者8,例如[18-65]是1或者8-6或者5中任选一个 。
1、exec正则的捕获方法--->先匹配,然后把匹配的内容捕获 。
如果字符串没有匹配这个正则,捕获的返结果是null 。
如果和正则匹配,返回的结果是一个数组 。
例子 var str ="2015zhufeng2016peixun" var reg = /\d+/,
第一项是我们捕获的内容 。
index:捕获的内容在元字符串中开始的索引位置 input:捕获的原始字符串 。
2、正则的捕获是懒惰的 。
正则的每一次捕获都从lastIndex值开始,第一次捕获的时候,lastIndex=0,从原始字符串索引为0的位置开始查找捕获,而默认的情况下,第一次捕获完成,lastIndex的值并没有发生改变,还是0,所以第二次捕获还是从原始字符串索引为0处开始查找,这样找到的还是第一次捕获的内容 解决办法:添加全局修饰符g--->加上g后,第一次捕获完成后,lastIndex的值发生了改变,变为第一次捕获内容后的第一个字符的开始索引,第二次捕获是继续向后查找的... 疑问:不用全局修饰符g每次捕获完成后手动修改lastIndex的值不可以么? 不可以,虽然手动修改了lastIndex,确实把lastIndex的值进行改变了,但是正则查找的时候还是从索引0开始的 。
1
2
|
var
str =
"zhufeng2015peixun2016"
;
var
reg = /\d+/g;
|
例子 。
为了防止没有加全局修饰符g导致的死循环,我们在处理之前,对于没有添加g的手动给添加一个g 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
RegExp.prototype.myExecAll =
function
myExecAll() {
var
_this =
this
, str = arguments[0], ary = [], res =
null
;
!_this.global ? _this = eval(_this.toString() +
"g"
) :
null
;
res = _this.exec(str);
while
(res) {
ary[ary.length] = res[0];
res = _this.exec(str);
}
return
ary;
};
var
ary = reg.myExecAll(str);
console.log(ary);
console.log(reg.lastIndex);
//->0
var
res = reg.exec(str);
console.log(res);
console.log(reg.lastIndex);
//->11
res = reg.exec(str);
console.log(res);
console.log(reg.lastIndex);
//->21
res = reg.exec(str);
console.log(res);
//->null
|
3、match:捕获字符串中存在一个叫做match的方法也可以实现捕获,而且只要我们取消了正则的懒惰性,执行一次match方法就可以捕获到所有内容了 。
1
2
3
|
var
str =
"zhufeng2015peixun2016"
;
var
reg = /\d+/g;
console.log(str.match(reg));
|
疑问:那我们都用match来替换exec多好啊?
4、正则的分组捕获 。
每一次捕获的时候,不仅仅可以把大正则匹配的内容捕获到,而且还可以把每一个小分组(子正则)匹配的内容单独的捕获到 。
1
2
3
4
5
|
var
str =
"zhufeng[2015]peixun[2016]"
;
var
reg = /\[(\d)(\d+)\]/g;
var
res = reg.exec(str);
console.log(res);
[
"[2015]"
,
"2"
,
"015"
, index: 7, input:
"zhufeng[2015]peixun[2016]"
]
|
第一项是大正则捕获的内容 res[0] 第二项是第一个分组捕获的内容 res[1] 第三项是第二个分组捕获的内容 rex[2] 。。。。.
分组的只匹配不捕获:我们如果执行把分组内容进行匹配但是不进行捕获的话,只需要在分组的前面加上?:即可 。
1
2
3
4
5
|
var
str =
"zhufeng[2015]peixun[2016]"
;
var
reg = /\[(?:\d)(\d+)\]/g;
var
res = reg.exec(str);
console.log(res);
[
"[2015]"
,
"015"
...]
|
数组中的第一项是大正则捕获的内容 res[0] 数组中的第二项是第二个分组捕获的内容 res[1] 第一个分组添加了?:,所以只匹配不捕获 。
5、exec和match的区别 。
match只能捕获大正则匹配的内容,对于分组捕获中,是无法获取分组匹配的内容的,所以如果捕获的时候不需要捕获分组的内容,我们直接用match更方便,如果需要捕获分组的内容,我们只能使用exec来一个个捕获 。
1
2
3
4
5
6
7
8
9
10
11
|
var
str =
"zhufeng[2015]peixun[2016]"
;
var
reg = /\[(\d+)\]/g;
//console.log(str.match(reg));//->["[2015]", "[2016]"]
var
ary = [];
var
res = reg.exec(str);
while
(res) {
//ary.push(res[1]);
ary.push(RegExp.$1);
//RegExp.$1获取当前正则第一个分组捕获的内容,(可能在部分IE浏览器下捕获不到值)
res = reg.exec(str);
}
console.log(ary);
|
6、正则的贪婪性:在每一次的捕获的时候,总是按照正则匹配的最长结果捕获 。
1
2
3
4
5
6
|
var
str =
"zhufeng2015peixun2016"
;
var
reg = /\d+/g;
console.log(reg.myExecAll(str));
//-->["2015","2016"]
var
str =
"zhufeng2015peixun2016"
;
var
reg = /\d+?/g;
console.log(reg.myExecAll(str));
//-->["2", "0", "1", "5", "2", "0", "1", "6"]
|
7、分组引用 。
\2代表出现和第二个分组一模一样的内容 。
\1代表出现和第一个分组一模一样的内容 。
1
2
|
var
reg=/^(\w)(\w)\2\1$/;
"woow"
、
"1221"
...
|
。
8、字符串方法---->replace:把一个字符串中的某个字符替换成新的内容 。
1)在不使用正则的情况下 。
执行一次replace只能替换字符串中的一个,需要替换多个同样需要执行多次 。
1
2
3
|
var
str =
"zhufeng2015 zhufeng2016"
;
"zhufeng"
->
"珠峰"
str = str.replace(
"zhufeng"
,
"珠峰"
).replace(
"zhufeng"
,
"珠峰"
);
|
。
有些时候即使执行多次,也实现不了替换 。
1
2
|
"zhufeng"
->
"zhufengpeixun"
str = str.replace(
"zhufeng"
,
"zhufengpeixun"
).replace(
"zhufeng"
,
"zhufengpeixun"
);
|
[第一个参数可以是一个正则] 把所有和正则匹配的内容进行替换(但是和捕获一样默认是懒惰的,只有加上全局修饰符g才可以) 。
1
2
3
|
var
str =
"zhufeng2015 zhufeng2016"
;
str = str.replace(/zhufeng/g,
"zhufengpeixun"
);
console.log(str);<br>
|
1)执行和执行次数问题 。
其实和exec捕获的原理是一模一样的 。
例如:我们第二个参数如果传递的是一个函数,每当正则在字符串中捕获一次当前的这个函数就执行一次 ->本题中一共捕获了两次,所以函数执行了两次 。
1
2
|
var
str =
"zhufeng2015 zhufeng2016"
;
str = str.replace(/zhufeng/g,
function
() {
|
2)参数问题 。
console.dir(arguments); 不仅仅是执行function,而且还给我们的函数传递了参数,并且传递的参数和每一次exec捕获的内容是一模一样的 如果是第一次exec捕获->["zhufeng",index:0,input:"原始字符串"] 第一次执行函数里面的参数 arguments[0] -> "zhufeng"/**/ arguments[1] -> 0 相当于exec中的index 开始捕获的索引位置 arguments[2] -> "原始字符串" 相当于exec中的input 。
3)返回值问题 。
return返回的是什么,就相当于把当前捕获的内容替换成什么 。
1
2
3
|
return
"zhufengpeixun"
;
});
console.log(str);
|
。
最后此篇关于常用正则表达式知识点解读及判读有效数字、手机号邮箱正则表达式的文章就讲到这里了,如果你想了解更多关于常用正则表达式知识点解读及判读有效数字、手机号邮箱正则表达式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
本文主要给大家介绍Mysql数据库分库和分表方式(常用),涉及到mysql数据库相关知识,对mysql数据库分库分表相关知识感兴趣的朋友一起学习吧 1 分库 1.1 按照功能分库 按照功能进行
在当前对象由其他包含对象操作的系统中,当传递对当前对象的引用时,链接似乎一直在继续......没有任何结束(对于下面的代码,Car ->myCurrentComponent->myCar_Brake-
我有一个密码 UIAlertView,我们要求用户提供。我需要根据情况在不同的 View 上询问它,从 downloadViewController (用户下载数据后),当他们切换到他们的数据时(如果
我正在尝试编写一个函数,使得对于任何整数 x 的 P(x) 都有一个包含三个元素的列表,即平方、立方和 n 的四次方,但我仍然不知道如何组合然后制作一个函数,例如我有平方、立方体和 4 次幂函数下面是
关闭。这个问题需要更多 focused .它目前不接受答案。 关闭4年前。 锁定。这个问题及其答案是locked因为这个问题是题外话,但具有历史意义。它目前不接受新的答案或交互。 我能否列出一份常见的
Python 常用 PEP8 编码规范 代码布局 缩进 每级缩进用4个空格。 括号中使用垂直隐式缩进或使用悬挂缩进。 EXAMPLE: ?
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 去年关闭。 Improve this questio
在经典 ui 中,您可以使用 xtype:cqinclude 包含来自不同路径的 rtePlugins,基本上为标准 RTE 插件创建一个位置,我如何在 Touch UI 中执行相同操作? 我尝试使用
在经典 ui 中,您可以使用 xtype:cqinclude 包含来自不同路径的 rtePlugins,基本上为标准 RTE 插件创建一个位置,我如何在 Touch UI 中执行相同操作? 我尝试使用
*strong text*我有多个网络应用程序使用了一些常见的依赖项,比如蒙戈连接器谷歌 Guava 乔达时间 我想到将它们从 webapp/WEB-INF/lib 中取出并放入一些 common-l
我正在编写一个 Web 服务器,我想知道哪些 HTTP 请求 header (由客户端发送)是最常见的,因此我应该重点实现。 目前,我只支持Accept 和Host。 最佳答案 不确定您的范围,但由于
我是一名优秀的程序员,十分优秀!