正则表达式
正则方法
字符串的正则方法
String.prototype.match(reg)
- 参数
- regexp:正则表达式(如果参数不是正则表达式,通过
RegExp()
构造函数将其转换成正则表达式)
- regexp:正则表达式(如果参数不是正则表达式,通过
- 返回
- 无匹配:返回
null
- 正则表达式没有全局修饰符
g
,则不执行全局检索,返回数组result
result[0]
:匹配的字符串result[1..n]
:正则表达式中用圆括号括起来的子表达式1...nresult.index
:发生匹配的字符在 str 中的开始位置result.input
:所检索的字符串
- 正则表达式有全局修饰符
g
,则执行全局检索,返回有匹配结果组成的数组 resultresult[0..n]
:匹配结果1..n+1
- 无匹配:返回
String.prototype.search(reg)
- 参数
- reg:正则表达式(如果参数不是正则表达式,通过
RegExp()
构造函数将其转换成正则表达式)
- reg:正则表达式(如果参数不是正则表达式,通过
- 返回
- 无匹配:返回
-1
- 有匹配,返回第一个与之匹配的字串的起始位置(不支持全局搜索,会忽略全局修饰符 g)
- 无匹配:返回
String.prototype.replace(reg, str)
- 功能:执行检索和替换操作
- 在替换字符串(第二个参数)中出现了 $ 加数字,代表正则表达式中与圆括号相匹配的字表达式
- 正则表达式中是否有全局修饰符 g
- 有:替换所有匹配的字符串
- 没有:只替换匹配的第一个字符串
String.prototype.splice(reg)
- 参数
- reg:正则表达式
- 返回
- 以 reg 拆分成的各个子串的数组
正则表达式的字符串方法
RegExp.prototype.test(str)
执行检索,查看正则表达式与指定的字符串是否匹配,返回true
或false
。
如果正则表达式设置了全局标志g
,test()
的执行会改变正则表达式lastIndex
属性。连续的执行test()
方法,后续的执行将会从lastIndex
处开始匹配字符串。
RegExp.prototype.exec(str)
- 返回
- 无匹配:返回
null
- 有匹配:返回
result
,结构同String.prototype.match(reg)
方法正则无全局匹配的结果result[0]
:匹配的字符串result[1..n]
:正则表达式中用圆括号括起来的字表达式1...nresult.index
:发生匹配的字符在str
中的开始位置result.input
:所检索的字符串- 如果设置了全局匹配,
reg.lastIndex
将是下一次匹配开始的位置(初始为0)
- 无匹配:返回
实例
千分位表示法
function thousandsFormat(str) {
const reg = /\B(?=(?:\d{3})+$)/g
// const reg = /(?!\b)(?=(?:\d{3})+$)/g
return str.replace(reg, ',');
};
1
2
3
4
5
2
3
4
5
说明:
\B
:匹配不是单词开头或结束的位置,即非边界位置(?=exp)
:零宽度正预测先行断言,如/^Java(?=Script$)/
,匹配JavaScript
里的Java
,不匹配Javascript
里的Java
(?:exp)
:匹配exp
,但不捕获匹配的文本,也不给此分组分配组号(即仅把exp
组合成一个整体)
非正则方法
function formatCash(str) {
return str.split('').reverse().reduce((prev, next, index) => {
return ((index % 3) ? next : (next + ',')) + prev
})
}
console.log(formatCash('1234567890')) // 1,234,567,890
1
2
3
4
5
6
2
3
4
5
6
function format(num) {
num = num + '';
const arr = num.split('').reverse();
for (let i = 3; i < arr.length + 1; i += 4) {
if (arr[i] !== undefined) {
arr.splice(i, 0, ',');
}
}
return arr.reverse().join('');
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
千分位表示法(带小数)
先将整数部分提取出来,再将提取出来的整数用千分位表示,小数部分保持不变。
const reg = /\B(?=(?:\d{3})+$)/g
function thousandsFormat(decimalsStr) {
return decimalsStr.replace(/\d+/, (num) => {
return num.replace(reg, ',')
})
};
1
2
3
4
5
6
2
3
4
5
6
去掉小数点后面多余的 0
// 正则
const regexp = /(?:\.0*|(\.\d+?)0+)$/
// 测试用例
const arr = [
'1200.00100',
'1200.00000',
'1200.',
'1200',
'1200.10000',
'0.120010000',
'0.000011111'
]
arr.forEach((item)=>{
console.log(item.replace(regexp,'$1'))
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16