我想将两个正则表达式合二为一,但是我不知道该如何做。
因此,我想做下一件事情:将格式编号转换为美国格式,只需将逗号添加为1000,例如 1,000 等。 (我了解toLocaleString('en-US')
和Intl.NumberFormat.prototype.format
,但这些都不适合我的情况)。
为此,我使用正则表达式尝试了以下表达式:/\d(?=(\d{3})+\.)/g
,它很好用,但如果我们的电话号码包含 点仅 > (例如1000.23
),但是如果没有 ,则当前的正则表达式将无法正常工作。
(证明: https://regex101.com/r/93O0gJ/1)
还有一个正则表达式,我必须使我的功能正常工作:/\d(?=(\d{3})+$)/g
,但是只有当我们 根本没有点 时,它才能正常工作。如果我们有点,它将用逗号替换 float或小数部分,这不是我所要求的正确行为。 (我的电话号码类似于1000.12345678 的“ 1000.12,345,678”)。但是,如果没有点号,则一切正常。
(证明:https://regex101.com/r/BHikK7/1)
因此,对于我来说,我创建了一个检查以下功能的函数: 如果 number 有点,则使用第一个正则表达式;如果没有,则使用第二个:
const formatNumberToUSFormat = (numberToFormat: number):string => {
const stringNumber = numberToFormat.toString()
return stringNumber.match(/\./g) ?
stringNumber.replace(/\d(?=(\d{3})+\.)/g, '$&,') :
stringNumber.replace(/\d(?=(\d{3})+$)/g, '$&,')
}
我的主要问题-在我的情况下,如何将两个正则表达式合并为一个,从而避免不必要地检查点等。 预先感谢。
答案 0 :(得分:3)
由于只有(?= ...)'followed by'表达式而没有'preced by'-您可以反转字符串以正确使用'followed by',如下所示:
const num = '1234567890.12345';
const result = [...[...num] // destructing the string
.reverse().join('') // reversing the original string
.replace(/(?:\d+\.)?(\d{3}(?=\d))/g,'$&,')]
.reverse().join(''); // reversing the result back to normal
console.log(result);
但是这种方法从最佳角度来说是绝妙的!
如果您要处理大量数据,请不要使用它!
答案 1 :(得分:1)
来自地狱的正则表达式,但有效)))
const num = '1234567890.123456';
const result = num.replace(new RegExp('\\B(?=(\\d{3})+'+(~num.indexOf('.')?'\\.':'$')+')','g'),',');
console.log(result);
答案 2 :(得分:0)
检查下一个正则表达式(?:(?<=^|[^\d.])(\d{1,3})(?=(?:\d{3})+(?:\D|$))|\G)(\d{3})
。
要在线尝试正则表达式并获取说明,请单击here。