正则表达式某些元字符的理解,基于js
2017-11-02 10:30
148 查看
正则表达式的字符描述,网上一搜一大堆,但是由于只有描述而没有具体例子,让人感觉还是有些模糊。
于是,我整理了一些比较不容易理解的字符的具体例子,加深理解。
先打个基础吧:
正则表达式中的元字符可以分为两种:匹配位置和匹配字符的元字符。
匹配位置的元字符:顾名思义就是设定要匹配的字符串的位置,匹配的是一个位置而不是一个字符。包括3种:^、$、\b。
匹配字符的元字符:通常只能匹配字符串集合中的一个字符。包括:. 、\w、\W、\s、\S、\d、\D 这7种。
( ):用于分组,分组又称子表达式。分组后将()内的表达式看做一个整体。也就是如果后接下面的限定符,即可对整个()内匹配多次。
(exp)这种形式又称捕获,即匹配exp,并捕获文本到自动命名的组里
另外,当被分组后,每个组自动有一个组号(从1开始)。该组号代表该组的表达式。\分组号 表示引用该分组。
如(\d)\d\1 这里的"\1"就是对"(\d)"的后向引用。
[ ]:表示一个字符组(有的书上写字符类),表示匹配方括号中的任意一个。也就是只占一个字符的位置。
{n}表示重复匹配n次、{n,}至少匹配n次、{n,m}表示匹配n到m次
限定符:上面说过元字符只能匹配一个位置或一个字符,要匹配多次需要用限定符。也就是说限定符可以指定特定字符或字符集匹配多少次。
包括但不限于:{n}、{n,}、{n,m}、+、?、*等等。
注意:只指定前面的一个字符(能占一个字符位的比如上面的匹配字符的元字符或者有实际意义的字符(数字、字母等等))
或者字符集(即上面的分组()中的内容)。
1、^
用法1:匹配输入的开始。如果多行标志被设置为true,那么也匹配换行符后紧跟的位置。
换句话说,只有在最开始(索引为0)搜索到匹配项才算,而[1]以后搜索到就不行。
例如:^string
表示匹配以string开头的行。
js例子如下:
用法2:当 ^ 作为第一个字符出现在一个字符集合模式时,表示反义。
即:[^]表示不包含,默认是一个字符长度。
例如:[^xyz]它匹配任何一个没有包含在方括号中的字符。注意这里[^xyz]只占1位,即除xyz的任意一个字符。
如下:
注:因为var l的是g模式,所以再次调用exec()方法是从前一个被发现的匹配项以后搜索。
2、$
用法:匹配输入的结束。如果多行标示被设置为true,那么也匹配换行符前的位置。
例如,/t$/ 并不会匹配 "eater" 中的 't',但是会匹配 "eat" 中的 't'。
即/string$/表示一定要匹配末尾是string的匹配项。
3、?
用法1:匹配前面一个表达式0次或者1次。等价于 {0,1}。
例如:colou?r : u?表示匹配前一个字符 0到1次。整体表示匹配colour或color。
用法2:在限定符*、+、{}、?后接?,表示非贪婪模式,即尽可能少的匹配。
"*?" 重复任意次,但尽可能少重复
如 "acbacb" 正则 "a.*?b" 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而"acbacb"最少字符的结果就 是"acb"
"+?" 重复1次或更多次,但尽可能少重复
与上面一样,只是至少要重复1次
"??" 重复0次或1次,但尽可能少重复
如 "aaacb" 正则 "a.??b" 只会取到最后的三个字符"acb"
"{n,m}?" 重复n到m次,但尽可能少重复
如 "aaaaaaaa" 正则 "a{0,m}" 因为最少是0次所以取到结果为空
"{n,}?" 重复n次以上,但尽可能少重复
如 "aaaaaaa" 正则 "a{1,}" 最少是1次所以取到结果为 "a"
用法3:用于分组中:
(?:x)表示匹配 'x' 但是不记住匹配项。这种叫作非捕获括号,使得你能够定义为与正则表达式运算符一起使用的子表达式。
例如:/(?:foo){1,2}/。如果表达式是 /foo{1,2}/,{1,2}将只对 ‘foo’ 的最后一个字符 ’o‘ 生效。如果使用非捕获括号,则{1,2}会匹配整个 ‘foo’ 单词。
x(?=y) 匹配'x'仅仅当'x'后面跟着'y'.这种叫做正向肯定查找。
例如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’仅仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。
x(?!y) 匹配'x'仅仅当'x'后面不跟着'y',这个叫做正向否定查找。
例如,/\d+(?!\.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。正则表达式/\d+(?!\.)/.exec("3.141")匹配‘141’但是不是‘3.141’
于是,我整理了一些比较不容易理解的字符的具体例子,加深理解。
先打个基础吧:
正则表达式中的元字符可以分为两种:匹配位置和匹配字符的元字符。
匹配位置的元字符:顾名思义就是设定要匹配的字符串的位置,匹配的是一个位置而不是一个字符。包括3种:^、$、\b。
匹配字符的元字符:通常只能匹配字符串集合中的一个字符。包括:. 、\w、\W、\s、\S、\d、\D 这7种。
( ):用于分组,分组又称子表达式。分组后将()内的表达式看做一个整体。也就是如果后接下面的限定符,即可对整个()内匹配多次。
(exp)这种形式又称捕获,即匹配exp,并捕获文本到自动命名的组里
另外,当被分组后,每个组自动有一个组号(从1开始)。该组号代表该组的表达式。\分组号 表示引用该分组。
如(\d)\d\1 这里的"\1"就是对"(\d)"的后向引用。
[ ]:表示一个字符组(有的书上写字符类),表示匹配方括号中的任意一个。也就是只占一个字符的位置。
{n}表示重复匹配n次、{n,}至少匹配n次、{n,m}表示匹配n到m次
限定符:上面说过元字符只能匹配一个位置或一个字符,要匹配多次需要用限定符。也就是说限定符可以指定特定字符或字符集匹配多少次。
包括但不限于:{n}、{n,}、{n,m}、+、?、*等等。
注意:只指定前面的一个字符(能占一个字符位的比如上面的匹配字符的元字符或者有实际意义的字符(数字、字母等等))
或者字符集(即上面的分组()中的内容)。
1、^
用法1:匹配输入的开始。如果多行标志被设置为true,那么也匹配换行符后紧跟的位置。
换句话说,只有在最开始(索引为0)搜索到匹配项才算,而[1]以后搜索到就不行。
例如:^string
表示匹配以string开头的行。
js例子如下:
var p=/^a/g; p.test('apple'); //true p.exec('parent'); //false
用法2:当 ^ 作为第一个字符出现在一个字符集合模式时,表示反义。
即:[^]表示不包含,默认是一个字符长度。
例如:[^xyz]它匹配任何一个没有包含在方括号中的字符。注意这里[^xyz]只占1位,即除xyz的任意一个字符。
如下:
var l=/[^xyz]/g; l.exec('apple'); //获得数组["a", index: 0, input: "apple"] l.exec('apple'); //再次调用得["p", index: 1, input: "apple"]
注:因为var l的是g模式,所以再次调用exec()方法是从前一个被发现的匹配项以后搜索。
2、$
用法:匹配输入的结束。如果多行标示被设置为true,那么也匹配换行符前的位置。
例如,/t$/ 并不会匹配 "eater" 中的 't',但是会匹配 "eat" 中的 't'。
即/string$/表示一定要匹配末尾是string的匹配项。
var m=/ple$/g; m.exec('apple'); //["ple", index: 2, input: "apple"]
3、?
用法1:匹配前面一个表达式0次或者1次。等价于 {0,1}。
例如:colou?r : u?表示匹配前一个字符 0到1次。整体表示匹配colour或color。
用法2:在限定符*、+、{}、?后接?,表示非贪婪模式,即尽可能少的匹配。
"*?" 重复任意次,但尽可能少重复
如 "acbacb" 正则 "a.*?b" 只会取到第一个"acb" 原本可以全部取到但加了限定符后,只会匹配尽可能少的字符 ,而"acbacb"最少字符的结果就 是"acb"
"+?" 重复1次或更多次,但尽可能少重复
与上面一样,只是至少要重复1次
"??" 重复0次或1次,但尽可能少重复
如 "aaacb" 正则 "a.??b" 只会取到最后的三个字符"acb"
"{n,m}?" 重复n到m次,但尽可能少重复
如 "aaaaaaaa" 正则 "a{0,m}" 因为最少是0次所以取到结果为空
"{n,}?" 重复n次以上,但尽可能少重复
如 "aaaaaaa" 正则 "a{1,}" 最少是1次所以取到结果为 "a"
用法3:用于分组中:
(?:x)表示匹配 'x' 但是不记住匹配项。这种叫作非捕获括号,使得你能够定义为与正则表达式运算符一起使用的子表达式。
例如:/(?:foo){1,2}/。如果表达式是 /foo{1,2}/,{1,2}将只对 ‘foo’ 的最后一个字符 ’o‘ 生效。如果使用非捕获括号,则{1,2}会匹配整个 ‘foo’ 单词。
x(?=y) 匹配'x'仅仅当'x'后面跟着'y'.这种叫做正向肯定查找。
例如,/Jack(?=Sprat)/会匹配到'Jack'仅仅当它后面跟着'Sprat'。/Jack(?=Sprat|Frost)/匹配‘Jack’仅仅当它后面跟着'Sprat'或者是‘Frost’。但是‘Sprat’和‘Frost’都不是匹配结果的一部分。
x(?!y) 匹配'x'仅仅当'x'后面不跟着'y',这个叫做正向否定查找。
例如,/\d+(?!\.)/匹配一个数字仅仅当这个数字后面没有跟小数点的时候。正则表达式/\d+(?!\.)/.exec("3.141")匹配‘141’但是不是‘3.141’
相关文章推荐
- Js屏蔽键盘输入的某些字符,用以部分代替正则表达式
- 理解Node.js的事件循环(代码是异步单线程,内部实现用的还是进程和线程,基于池化的线程实现异步)
- js判断字符串中是否存在某些字符的方法
- js屏蔽某些特殊字符(IE下)
- [置顶] 正则表达式语法等价字符/常用运算符/分割语法/正则等价简写释义速记理解技巧
- js判断字符串中是否存在某些字符的方法
- JS通用表单验证函数,基于javascript正则表达式
- 基于JS如何实现给字符加千分符(65,541,694,158)
- A/B 测试的基本概念举例理解以及具体实现方法【传统A/B测试基于后端的 A/B 测试(Back-end AB test),现在基本上基于前端js在客户端进行分流,有更多优点,请看里面】
- JS基于正则截取替换特定字符之间字符串操作示例
- 判断JS字符串中是否包含某些字符
- A/B 测试的基本概念举例理解以及具体实现方法【传统A/B测试基于后端的 A/B 测试(Back-end AB test),现在基本上基于前端js在客户端进行分流,有更多优点,请看里面】
- Js屏蔽键盘输入的某些字符,用以部分代替正则表达式
- 用JS调试来理解JS的prototype某些特性
- 华为编程大赛---含有通配符的字符串匹配问题---基于正则表达式
- ARM Linux 基于S3C2451的AD9833波形发生器/Linux字符驱动的理解
- JS 判断字符是否含有汉字
- 理解js中的原型链,prototype与__proto__的关系
- 正则表达式 查找以某些字符开始 某些字符结束的匹配项 解决之道