[TOC]javascript
开发过程当中,不少人止于正则,搜于网络。正则虽小,意义颇大。几乎全部开发语言都提供支持, 它始于仿生学(神经元描述)符号描述,崛起于各操做系统,附生于编辑器中,欣欣向荣,如日中天。前端
某大厂有这么一道题目,具备开放性。 大数字以千分位隔开即生活场景中的帐户金额,怎么作? 仁者见仁智者见智,办法总比问题多,然而一条简单正则轻松解决。java
正则表达式:/(\d{1,3})(?=(\d{3})+$)/g
如:linux
"1111234334".replace(/(\d{1,3})(?=(\d{3})+$)/g,"$1,")
不少场景下,用户会设置简单易记密码,为了不用户密码被撞库,被不法分子利用,须要在设置时校验,提示用户。正则表达式
如123456使用正则校验网络
/(0(?=1)|1(?=2)|2(?=3)|3(?=4)|4(?=5)|5(?=6)){5}/
对字符串进行过滤筛选匹配,获得预期的值或效果编辑器
对字符串和特殊符号操做的逻辑公式操作系统
表单校验,条件搜索查询,数据替换等code
linux 里面不少地方都用到对象
sed 's/pattern/replacement/flag' file
awk '/pattern/program' file
在任何匹配 pattern 的字符串开始处匹配查找字符串。
预查是非捕获特性,JAVASCRIPT不支持反向预查
?:
window(?:10|7) 能够匹配window10 或 window7 ``` javascript /window(?:10|7)/.test("window10") //true
匹配过程是如何的呢?
字符串从左到右,游标起始于字符串开始部分的左侧,正则表达式的w与字符串w匹配,匹配成功后,游标移动到w右侧,而后匹配i,匹配成功后,游标继续游走,以此类推直到游标停留到字符串末尾
?=
/window(?=7)/.test("window7") //true
匹配过程又如何呢?
游标由字符串的最左侧开始,正则表达式以此匹配直到window的右侧,此时游标停留,正则继续匹配,当匹配到7的时候,匹配成功。因为游标停留在7的左侧(即w的右侧),所以获得的匹配结果是window而不是window7
?!
/window(?!7)/.test("windowXP") //true
此时的匹配过程又该如何
跟上面?=相似,不一样的是XP与正则中的7不对应时为匹配成功
在任何不匹配pattern 的字符串开始处匹配查找字符串。
/(?<=best)pay/ 匹配bestpay
/(?<!best)pay/ 匹配alipay
例如:
javascript /ab*c/.test("abbbc") //匹配abbbc
过程以下:
游标从a左侧开始,正则与字符串匹配到ab后,b继续与b匹配,直到c与b匹配,发现不能匹配,因而,选用备选路线,选用用字符串c与正则c匹配,匹配上游标前进到c的右侧所有匹配完成
例如:
javascript /ab*?c/.test("ac") //匹配ac
正则中? 是优先考虑的
过程以下:
游标从字符串"ac"中a的左侧开始,正则a与字符a匹配上,游标前进到a的右侧,此时模式中的"b*?" 与字符"c"匹配不上,因而,选用备用方案,正则会用"c" 与跟 字符串的"c"匹配,匹配上后,游标移动到末尾,所以匹配的值是ac
基于PCRE的正则引擎有一个特色:递归和回溯
javascript /^c*?d(?=e)/.test("cde") //true, 匹配cd
$表示字符串末尾
相似?=e这种零位占用还有^,$
javascript /tf??a/.test("tea") //false
过程以下:
对于??,是可优先忽略的
优先级从高到低
操做符号 | 描述 |
---|---|
\ | 转义符 |
(), (?:), (?=), [] | 圆括号和方括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \anymetacharacter | 位置和顺序 |
任何东西都得以辩证角度看待,凡是都有好有坏。 虽然正则能够做为一种途径实现业务需求,可是,因为自身的特性(递归,回溯等)会致使执行效果在某些场景下匹配速度较慢,还不如直接使用字符串的搜索。
字符 | 含义 | 备注 |
---|---|---|
\f | 换页符 | 等价于 \x0c 和 \cL |
\cx | 匹配由x指明的控制字符 | \cM 匹配一个 Control-M 或回车符 |
\n | 换行符 | 等价于 \x0a 和 \cJ |
\r | 匹配一个回车符。 | 等价于 \x0d 和 \cM。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。 | 等价于 [ \f\n\r\t\v]。 |
\S | 匹配任何非空白字符。 | 等价于 [^ \f\n\r\t\v]。 |
\t | 匹配一个制表符。 | 等价于 \x09 和 \cI。 |
\v | 匹配一个垂直制表符。 | 等价于 \x0b 和 \cK。 |
字符 | 含义 | 备注 |
---|---|---|
\$ | 匹配输入字符串的结尾位置。 | 若是设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符自己,请使用 \$。 |
( ) | 标记一个子表达式的开始和结束位置。 | 子表达式能够获取供之后使用。要匹配这些字符,请使用 ( 和 )。 |
* | 匹配前面的子表达式零次或屡次。 | 要匹配 * 字符,请使用 *。 |
+ | 匹配前面的子表达式一次或屡次。 | 要匹配 + 字符,请使用 +。 |
. | 匹配除换行符 \n以外的任何单字符。 | 要匹配 .,请使用 \。 |
[ | 标记一个中括号表达式的开始。 | 要匹配 [,请使用 [。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。 | 要匹配 ? 字符,请使用 \?。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。 | 例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\’ 匹配 “\”,而 ‘(’ 则匹配 “(”。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。 | 要匹配 ^ 字符自己,请使用 \^。 |
{ | 标记限定符表达式的开始。 | 要匹配 {,请使用 \{。 |
指明两项之间的一个选择。 |
定位符号
用来描述字符串或单词的边界
字符 | 含义 | 备注 |
---|---|---|
* | 匹配前面的子表达式零次或屡次。 | * 等价于{0,}。 |
+ | 匹配前面的子表达式一次或屡次。 | + 等价于 {1,}。 |
? | 匹配前面的子表达式零次或一次。 | ? 等价于 {0,1}。 |
{n} | n 是一个非负整数。匹配肯定的 n 次。 | 例如,’o{2}’ 不能匹配 “to” 中的 ‘o’,可是能匹配 “tooth” 中的两个 o。 |
{n,} | n 是一个非负整数。至少匹配n 次。 | 例如,’o{2,}’ 不能匹配 “to” 中的 ‘o’,但能匹配 “foooood” 中的全部 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 | 例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。 |
字符 | 含义 | 备注 |
---|---|---|
\d | 匹配一个数字字符。 | 等价于 [0-9]。 |
\D | 匹配一个非数字字符。 | 等价于 [^0-9]。 |
\w | 匹配包括下划线的任何单词字符。 | 等价于’[A-Za-z0-9_]’。 |
\W | 匹配任何非单词字符。 | 等价于 ‘[^A-Za-z0-9_]’。 |
\num | 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。 | 例如,’(.)\1′ 匹配两个连续的相同字符。 |
做者简介:
就任于甜橙金融信息技术部,负责前端开发工做,前后任职携程,平安等公司的前端开发工程师职位,喜欢研究新的技术,服务于业务需求,熟练运用Linux/Unix系统命令,以终端为载体,快速执行操做。