正则表达式
含义:正则表达式用于匹配字符串中字符组合的模式。
value = value.replace(/d(d{3})(?=(,|$))/, "$1");
(?=(,|$)) 的含义
贪婪模式,在量词后面加问号,就是尽可能少地匹配。
?如果紧跟在任何量词 *、 +、? 或 {} 的后面,将会使量词变为非贪婪的(匹配尽量少的字符),和缺省使用的贪婪模式(匹配尽可能多的字符)正好相反。
简单模式 与特殊字符
- 简单模式
简单模式: 是由你找到的直接匹配所构成的。比如,/abc/这个模式就匹配了在一个字符串中,仅仅字符abc
同时出现并按照这个顺序。
项目中的例子:去掉货币格式的字符串,
去掉。
// 待处理字符串
let price = '123,456,7';
// 处理
price.replace(/,/g,'');
- 使用特殊字符(元字符等)
特殊字符: 当你需要搜索一个比直接匹配需要更多条件的匹配时候,比如寻找一个或者多个b
,或者寻找空格,那么这时模式将要包含特殊字符。比如,模式/ab*c/匹配了一个单独的'a'后面跟了0个或者多个'b',且后面跟着'c'的任意字符。
正则表达式中的特殊字符
反斜杠
在非特殊字符之前的反斜杠表示下一个字符是特殊的,不能从字面上解释。例如,没有前面的''的'b'通常匹配小写'b',无论它们出现在哪里。如果加了''这个字符变成了一个特殊意义的字符,意思是匹配一个字符边界。
反斜杠也可以将气候的特殊字符,转义为字面量。例如,模式/a*/代表会匹配0个或者多个a,相反,模式/a*/将 *
的特殊性移除,从而可以匹配像'a'这样的字符串。
^ $
约束字符的开始与结束
量词的应用
-
- 匹配前一个表达式0次或多次。等价于{0,}
-
- 匹配当前一个表达式1次或者多长。等价{1,}
- ? 匹配前面一个表达式0次或者1次,等价{0,1}
?
的特殊使用,如果紧跟在任何量词*、+、?、{}
的后面,将会使量词变为非贪婪模的,即匹配经可能少的字符,和缺省使用的贪婪模式(尽可能多的字符)正好相反。
特殊使用
(x)分组。匹配'x'且记住匹配项,括号被成为捕获括号,就是对分组的引用,不同的说法。
(?:x)匹配但是不记住匹配项目。
lookahead && negative lookahead
”先行断言“指的是,x只有在y前面才匹配,必须写成/x(?=y)/。比如,只匹配百分号之前的数字,要写成/d+(?=%)/。”先行否定断言“指的是,x只有不在y前面才匹配,必须写成/x(?!y)/。比如,只匹配不在百分号之前的数字,要写成/d+(?!%)/。
x(?=y)匹配x
仅仅当后面跟着y
.这种叫做正向肯定查找,y
都不是匹配结果的一部分。
x(?!y)匹配x
仅仅当x
后面不跟着x
,这种叫做正向否定查找。
lookbehind && negative lookbehind(提案阶段,阮一峰es6教程已更新)
“后行断言”正好与“先行断言”相反,x只有在y后面才匹配,必须写成/(?<=y)x/。比如,只匹配美元符号之后的数字,要写成/(?<=$)d+/。”后行否定断言“则与”先行否定断言“相反,x只有不在y后面才匹配,必须写成/(?<!y)x/。比如,只匹配不在美元符号后面的数字,要写成/(?<!$)d+/。
var f = '99999999999'.replace(/d{1,3}(?=(d{3})+$)/g, '$&,');
var f = '99999999999.02'.replace(/d{1,3}(?=(d{3})+(?:.d{1,2})?$)/g, '$&,');