- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章深入浅析js中的正则表达式由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
阅读目录 。
很多时候多会被正则表达式搞的晕头转向,最近抽出时间对正则表达式进行了系统的学习,整理如下:
正则表达式的创建 。
两种方法,一种是直接写,由包含在斜杠之间的模式组成;另一种是调用RegExp对象的构造函数.
两种方法的创建代码如下:
1
2
3
4
5
6
7
|
// 直接创建
const regex1 = /ab+c/;
const regex2 = /^[a-zA-Z]+[0-9]*\W?_$/gi;
// 调用构造函数
const regex3 =
new
RegExp(
'ab+c'
);
const regex4 =
new
RegExp(/^[a-zA-Z]+[0-9]*\W?_$/,
"gi"
);
const regex5 =
new
RegExp(
'^[a-zA-Z]+[0-9]*\W?_$'
,
'gi'
);
|
可以看出,调用RegExp构造函数创建正则表达式时,第一个参数可以是字符串,也可以是直接创建的正则表达式.
需要注意的是:RegExp实例继承的toLocaleString()和toString)()方法都会返回正则表达式的字面量,与创建正则表达式的方式无关 。
例如:
1
2
3
4
|
const ncname =
'[a-zA-Z_][\\w\\-\\.]*'
;
const qnameCapture =
'((?:'
+ ncname +
'\\:)?'
+ ncname +
')'
;
const startTagOpen =
new
RegExp(
'^<'
+ qnameCapture);
startTagOpen.toString();
// '/^<((?:[a-zA-Z_][\w\-\.]*\:)?[a-zA-Z_][\w\-\.]*)/'
|
正则表达式中的特殊字符 。
\ (反斜杠) 。
1.在非特殊字符前加反斜杠表示下一个字符是特殊的; 。
2.将其后的特殊字符转译为字面量; 。
注意:在使用RegExp构造函数时要将\转译,因为\在字符串里也是转译字符 。
^ 。
1.匹配输入的开始; 。
2.在[]中的第一位时表示反向字符集; 。
例子:
1
2
|
/^A/.exec(
'an A'
)
// null
/^A/.exec(
'An E'
)
// ["A", index: 0, input: "An E"]
|
$ 。
。
匹配输入的结束 。
1
2
3
|
/t$/.exec(
'eater'
)
// null
/t$/.exec(
'eat'
)
// ["t", index: 2, input: "eat"]
*, +, .(小数点)
|
*:匹配前一个表达式0次或多次。等价于 {0,}; 。
+:匹配前面一个表达式1次或者多次。等价于 {1,}; 。
.:
匹配除换行符之外的任何单个字符; 。
? (问号) 。
1.匹配前面一个表达式0次或者1次。等价于 {0,1}; 。
2.如果紧跟在任何量词 * + ? {} 的后面,将会使量词变为非贪婪的(匹配尽量少的字符),和缺省使用的贪婪模式正好相反; 。
3.运用于先行断言 。
例子:
1
2
|
/\d+/.exec(
'123abc'
)
// ["123", index: 0, input: "123abc"]
/\d+?/.exec(
'123abc'
)
// ["1", index: 0, input: "123abc"]
|
(x) 。
匹配 'x' 并且记住匹配项,括号表示捕获括号; 。
例子:
1
2
3
4
5
6
|
/(foo) (bar) \1 \2/.test(
'bar foo bar foo'
);
// false
/(bar) (foo) \1 \2/.test(
'bar foo bar foo'
);
// true
/(bar) (foo) \1 \2/.test(
'bar foo'
);
// false
/(bar) (foo) \1 \2/.test(
'bar foo foo bar'
);
// false
/(bar) (foo) \2 \1/.test(
'bar foo foo bar'
);
// true
'bar foo bar foo'
.replace( /(bar) (foo)/,
'$2 $1'
);
// "foo bar bar foo"
|
模式 /(foo) (bar) \1 \2/ 中的 '(foo)' 和 '(bar)' 匹配并记住字符串 "foo bar foo bar" 中前两个单词。模式中的 \1 和 \2 匹配字符串的后两个单词.
注意:\1、\2、\n 是用在正则表达式的匹配环节,在正则表达式的替换环节,则要使用像 $1、$2、$n 这样的语法。例如,'bar foo'.replace( /(...) (...)/, '$2 $1' ).
(?:x) 。
匹配 'x' 但是不记住匹配项,这种叫作非捕获括号; 。
例子:
1
2
3
4
|
'foo'
.match(/foo{1,2}/)
// ["foo", index: 0, input: "foo"]
'foo'
.match(/(?:foo){1,2}/)
// ["foo", index: 0, input: "foo"]
'foofoo'
.match(/(?:foo){1,2}/)
// ["foofoo", index: 0, input: "foofoo"]
'foofoo'
.match(/foo{1,2}/)
// ["foo", index: 0, input: "foofoo"]
|
使用场景:示例表达式 /(?:foo){1,2}/。如果表达式是 /foo{1,2}/,{1,2}将只对 ‘foo' 的最后一个字符 'o‘ 生效。如果使用非捕获括号,则{1,2}会匹配整个 ‘foo' 单词.
x(?=y), x(?!y), x|y 。
x(?=y):匹配'x'仅仅当'x'后面跟着'y'; 。
x(?!y):匹配'x'仅仅当'x'后面不跟着'y'; 。
x|y: 匹配x或y 。
这两种匹配的结果都不包含y 。
例子:
1
2
3
4
|
'JackSprat'
.match(/Jack(?=Sprat)/)
// ["Jack", index: 0, input: "JackSprat"]
'JackWprat'
.match(/Jack(?=Sprat)/)
// null
'JackWprat'
.match(/Jack(?=Sprat|Wprat)/)
// ["Jack", index: 0, input: "JackWprat"]
/\d+(?!\.)/.exec(
"3.141"
)
// ["141", index: 2, input: "3.141"]
|
{n}, {n,m}
{n}:匹配了前面一个字符刚好发生了n次; 。
{n,m}:匹配前面的字符至少n次,最多m次。如果 n 或者 m 的值是0, 这个值被忽略; 。
例子:
1
2
3
4
5
6
7
|
/a{2}/.exec(
'candy'
)
// null
/a{2}/.exec(
'caandy'
)
// ["aa", index: 1, input: "caandy"]
/a{2}/.exec(
'caaandy'
)
// ["aa", index: 1, input: "caaandy"]
/a{1,3}/.exec(
'candy'
)
// ["a", index: 1, input: "candy"]
/a{1,3}/.exec(
'caandy'
)
// ["aa", index: 1, input: "caandy"]
/a{1,3}/.exec(
'caaandy'
)
// ["aaa", index: 1, input: "caaandy"]
/a{1,3}/.exec(
'caaaandy'
)
// ["aaa", index: 1, input: "caaaandy"]
|
[xyz], [^xyz] 。
[xyz]:一个字符集合。匹配方括号的中任意字符,
[^xyz]:一个反向字符集。匹配任何没有包含在方括号中的字符; 。
这两种匹配都可以使用破折号(-)来指定一个字符范围,特殊符号在字符集中没有了特殊意义.
例:
1
2
3
4
|
function
escapeRegExp(string){
return
string.replace(/([.*+?^=!:${}()|[\]\/\\])/g,
"\\$&"
);
//$&表示整个被匹配的字符串
}
|
例子中的.*+?^=!:${}()都表示字面量,并没有特殊意义.
其他 。
\b:匹配一个词的边界。一个匹配的词的边界并不包含在匹配的内容中。换句话说,一个匹配的词的边界的内容的长度是0; 。
\B: 匹配一个非单词边界; 。
例子:
1
2
3
4
5
|
/\bm/.exec(
'moon'
)
// ["m", index: 0, input: "moon"]
/\bm/.exec(
'san moon'
)
// ["m", index: 4, input: "san moon"]
/oo\b/.exec(
'moon'
)
// null
/\B../.exec(
'noonday'
)
// ["oo", index: 1, input: "noonday"]
/y\B../.exec(
'possibly yesterday'
)
// /y\B../.exec('possibly yesterday')
|
\d:匹配一个数字,等价于[0-9]; 。
\D:匹配一个非数字字符,等价于[^0-9]; 。
\f:匹配一个换页符 (U+000C); 。
\n:匹配一个换行符 (U+000A); 。
\r:匹配一个回车符 (U+000D); 。
\s:匹配一个空白字符,包括空格、制表符、换页符和换行符,等价于[ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]; 。
\S:匹配一个非空白字符,等价于[^ \f\n\r\t\v\u00a0\u1680\u180e\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]; 。
\w:匹配一个单字字符(字母、数字或者下划线),等价于[A-Za-z0-9_]; 。
\W:匹配一个非单字字符,等价于[^A-Za-z0-9_]; 。
正则表达式标志 。
g:全局搜索; 。
i:不区分大小写; 。
m:多行搜索; 。
正则表达式使用 。
RegExp有exec()和test()方法; 。
exec匹配的结果为:匹配结果、捕获结果,index和input.
test匹配的结果为true或false,效率比exec要高.
String有match(),replace(),search(),split()方法; 。
match匹配的结果同RegExp的exec,replace根据正则表达式替换,search查找所以位置,split根据正则表达式分割字符串.
其中,当replace有function时,参数说明如下:
* 匹配项 * 记忆项(括号里面的项) * ... * 匹配的index * input输入项 。
以上所述是小编给大家介绍的js中的正则表达式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:http://www.cnblogs.com/WeiRuifeng/p/7070711.html 。
最后此篇关于深入浅析js中的正则表达式的文章就讲到这里了,如果你想了解更多关于深入浅析js中的正则表达式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
很多朋友或许都有这个疑问,一个网站域名和网站的排名有关系吗?今天本文就从三个方面分析网站的域名与网站的排名有没有关系,希望对大家有一定的帮助。 1、全拼双拼域名 首先,我们要知道在这一点百
什么是进程 当一个程序进入内存中运行起来它就变为一个进程。因此,进程就是一个处于运行状态的程序。同时进程具有独立功能,进程是操作系统进行资源分配和调度的独立单位。 什么是线程 线程是进
最近几年,互联网络竞争异常激烈,各个企业为了增加业绩,都在网络销售中下足了功夫。要确定网站发展的方向,必须给自己的网站制定好一个发展目标,有了目标才能更好的发展。不管
一.基础知识准备: 1.层的原则: (1)每一层以接口方式供上层调用。 (2)上层只能调用下层。 (3)依赖分为松散交互和严格交互两种。 2.业务逻辑分类: (1)应
编程时一门技术,更是一门艺术 简单工厂模式利用面向对象方式通过继承、封装、多态把程序的耦合度降低,设计模式使得程序更加灵活,容易修改,易于复用。 下面是服务器计算器代码:
对于策略模式的理解:当一个业务有多种需求时候,在某个时候需要使用不同的方式来计算结果。这时候不同的方式可以理解为不同的策略来解决同样的问题。 例如:商场收银系统计算价格,1:正常计算 2:商品打折计
随着 Kubernetes 在企业中应用的越来越广泛和普及,越来越多的公司在生产环境中运维多个集群。本文主要讲述一些关于多集群 Kubernetes 的思考,包括为什么选择多集群,多集群的好处以
Kubelet 出于对节点的保护,允许在节点资源不足的情况下,开启对节点上 Pod 进行驱逐的功能。最近对 Kubelet 的驱逐机制有所研究,发现其中有很多值得学习的地方,总结下来
以下分析不针对任何快递公司,纯属实说。 申通快递在快递行业中速度与费用都属于中等的水平,在国内也分布有很多投递点,一般地区都可以投递到;顺丰在国内是速度最快的快递公司之一,一般来说隔天就能够到,其
概述 流(streams)是PHP4.3版本引入的一个特性,主要是为了统一文件、sockets以及其他类似资源的工作方法。PHP4.3距今已经有很长时间了,但是很多程序员似乎都不能正确使用PHP中
Pre 很早在看 Jesse 的 Asp.net Core快速入门 的课程的时候就了解到了在Asp .net core中,如果添加的Json配置被更改了,是支持自动重载配置的,作为一名有着严重&q
之前对closure一知半解,在网上也找不到一篇文章能把它说清楚,今天好像第一次对它有点清晰的了解 了,写个BLOG记念一下 lua的函数是一种 First-Class Value 的东西, 到底
1、什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。 为什么要有这个特性?首先,之前的接口是个双
信息数据传输的安全一直都是个很重要的话题,从刚开始当程序员时错以为MD5、SHA1这些哈希算法就是加密算法,到后来慢慢接触对称加密、非对称加密这些概念,再到对接各种大开发平台接口的时候看到他们通
前言 2021年,vanilla-extract 作为黑马登顶了 css-in-js 满意度榜首(虽然使用率仅为1%),号称是一个类型安全、高度兼容 TS 场景的库,国内相关讨论还很少,稍微看
(一)响应式数据 1. 简单例子 从最简单的数据绑定开始,在 Vue 2.0 中,我们这样将一个数据绑定到模板的指定位置: 在组件创建参数的 data 构造函数中返回一个用来绑定的数据对象,其
我是一名优秀的程序员,十分优秀!