之前写正则都是种种上网搜刮,照样没有体系的进修过正则表达式的用法,本日稍稍研讨了一下下,觉得照样收成颇丰的,分享给列位,愿望关于你们有所协助~~
修饰符
-
g
–全局婚配 -
i
–不辨别大小写,默许辨别 -
m
–多行搜刮
预定义类字符
-
\d
: 数字;[0-9]
-
\D
: 非数字字符;[^0-9]
-
\s
: 空白符;[\t\n\x0B\f\r]
-
\S
: 非空白符;[^\t\n\x0B\f\r]
-
\w
: 单词字符(字母,数字,下划线);[a-zA-Z_0-9]
-
\W
: 非单词字符;[^a-zA-Z_0-9]
字符类
-
[]
: 示意字符类[]
中的^
示意取反,-
示意局限如:[0-9][a-z]
;
量词
-
?
: 涌现0次或许1次(最多涌现一次); -
+
: 涌现1次或许屡次(起码涌现1次); -
*
: 涌现0次或许屡次(恣意次); -
{n}
: 涌现n次; -
{n,m}
: 涌现n到m次 -
{n,}
: 最少涌现n次;
经常运用的边境字符
-
^
: 以xxxx最先; -
$
: 以xxxx末端; -
\b
: 单词边境; -
\B
: 非单词边境;
贪欲形式
如\d{3,6}
婚配3-6个数字,那末 “12345678”就会婚配\d{6}
非贪欲形式
在量词背面加上?就会尽量少的婚配了,上面的例子\d{3,6}?
就会婚配\d{3}
了
分组
想要婚配abc反复三次的场景,abc{3}
不就行了?事实上abc{3}
婚配的是c{3},若想婚配abc3次则须要用到分组的观点了;
正则中()示意分组,及(abc){3}
为婚配 abc 3次
$n代表婚配的分组
如:2018-03-03婚配换成2018年03月03日?
"2018-03-01".replace(/(\d{4})-(\d{2})-(\d{2})/g,"$1年$2月$3日");
分组中不想被婚配到的分组在分组中加上?:
就能够了,如上例:
"2018-03-01".replace(/(\d{4})-(?:\d{2})-(\d{2})/g,"$1年$2月$3日");
这时刻第二个分组就不会被捕捉,就相当于有两个分组,所以不存在$3
这时刻的输出效果就会是 "2018年01月$3日";
或
aaa | bbb 两个同时婚配
前瞻,后顾
前瞻就是在正则表达式婚配到划定规矩的时刻,向前搜检是不是相符断言(”前”的观点就是正则表达式从文本头部向尾部最先剖析)
Javascript 不支持后顾所以这里就不做过量研讨了哈。
-相符特定断言为 一定/正向 婚配
正向前瞻:exp(?=assert)
例子:
"s3&df34a7".replace(/\w(?=\d)/g,'OK');
会输出 "OK3&dOKOK4OK7"
即找到婚配的单词(w)后会再次婚配背面的字符是不是是数字,假如是则当前婚配的字符替代为OK,本次替代的单词(w)是s,f,3,a
-不相符特定断言为 否认/负向 婚配
负向前瞻:exp(?!assert)
栗子:
"s3&df34a7".replace(/\w(?=\d)/g,'OK');
会输出 "sOK&OKf3OKaOK"
即找到婚配的单词(w)后会再次婚配背面的字符是不是是数字,假如不是则当前婚配的字符替代为OK,本次替代的单词(w)是3,d,4,7。把7算进来我以为是婚配到7的时刻背面没有字符了是空也不是数字所以被替代了,假如不对还请大神斧正哈。
对象属性
-
global
是不是全文搜刮,默许为false
,修饰符中的g; -
ignoreCase
是不是大小写敏感,默许为false
,修饰符中的i; -
multiline
多行搜刮,默许为false
,修饰符中的m; -
lastIndex
是当前表达式婚配内容的末了一个字符的下一个位置(有点绕哈,背面会诠释); -
source
正则表达式的文本字符串;
举个栗子:
var reg = /\w/gim;
reg.global // true
reg.ignoreCase //true
reg.source // "\w"
要领
要领一
-
RegExp.prototype.test(str)
用于测试字符串参数中是不是存在婚配正则表达式形式的字符串,假如存在则返回true
,不然返回false
;
举个栗子:
var reg1 = /\w/;
reg1.test('a'); // true
reg1.test('#'); // false
reg1.test('a'); // true
reg1.test('#'); // false
再举个栗子:
var reg2 = /\w/g;
reg2.test('a'); // true
reg2.test('#'); // false
reg2.test('a'); // false
reg2.test('a'); // true
reg2.test('a'); // false
看到区别了么?当全局检索时为何第二次实行reg2.test('a');
时返回false
呢?如今就要说说上文提到的对象属性lastIndex
啦,没记着的回到上面看看定义,当第一次实行时我们获取到的lastIndex
是1,那下一次就会从2的位置最先实行,而我们能够晓得2的位置是没有字符的,所以返回false
,第三次实行的时刻有返回了true
是由于查询到没有字符了lastIndex
又重置了。一样的你也能够测试reg2.test('aaa')
第四次实行的时刻就会是false了,须要晓得的是,只要在全局检索时(g)lastIndex
才会见效,不然的话只会返回 0 哦
要领二
RegExp.prototype.exec(str)
运用正则表达式形式对字符串实行搜刮,并将更新全局RegExp
对象的属性以反应婚配效果。假如没有婚配的文本则返回null
,不然返回一个数组:-
index
声明婚配文本的第一个字符的位置; -
input
寄存被检索字符串的string
;
-
非全局挪用
挪用非全局的RegExp
对象的exec()
要领时,返回数组
- 第一个元素是与正则表达式相婚配的文本
- 第二个元素是与
RegExp
对象的第一个子表达式(上文中的分组)相婚配的文本(假如有的话) - 第二个元素是与
RegExp
对象的第二个子表达式(上文中的分组)相婚配的文本(假如有的话),以此类推
举个栗子:
var reg = /\d(\w)(\w)\d/;
var text = '1az2bc3cf4df5gf';
var regexec = reg.exec(text);
console.log(reg.lastIndex + '\t' + regexec.index + '\t' + regexec.toString()); //0 0 1az2,a,z
由于黑白全局挪用所以reg.lastIndex
返回 0;regexec.index
返回了0,婚配到的文本的第一个字符是”1″,index也就是0,regexec
返回的数组第一元素是与reg
相婚配的文本,第二个元素是该文本中的相符正则表达式中第一个分组(w)的文本是"a"
背面的z同理。
全局挪用
再来看看全局挪用的例子
var reg = /\d(\w)(\w)\d/g;
var text = '1az2bc3cf4df5gf';
while(regexec = reg.exec(text)){
console.log(reg.lastIndex + '\t' + regexec.index + '\t' + regexec.toString());
}
// 4 0 1az2,a,z
// 10 6 3cf4,c,f
全局挪用 lastIndex
见效 离别读取到1az2
和3cf4
的下一个字符的位置,背面与非全局挪用同理,不过全局挪用返回的是整段字符串相符划定规矩的文本。
嗯哼,这篇文章就到这里了,假如对你有所协助点个赞啦猫大在此谢过啦
本文会在个人博客更新的哦,博主可好了,有空散步散步~~~