我有一个textNode,其中的数据像data=$(2000)%
一样,所以我想把符号和数字分开。
let preText = ''
let number = ''
let postText = ''
let data = '$(2000)%'
const regex = new RegExp(`(([)?[0-9]{1,3}(?:,[0-9]{1,3})*(.[0-9]{1,5})?()])?`);
data.match(regex)
Output expected:
preText = '$('
number = '2000'
postText = ')%'
另一个例子:如果是data=$2,23,603
,输出应该是preText=$
、number=2,23,603
和postText=
。
我无法用不同的变量来实现这一点,我如何才能获得所需的输出?
您可以使用
const data = '$(2000)%';
const regex = /^(.*?)((?:d{1,3}(?:,d{1,3})*|d+)(?:.d{1,5})?)(D.*)?$/;
const [_, preText, number, postTex] = data.match(regex);
console.log([preText, number, postTex]);
详细信息:
^
-字符串的开头(.*?)
-第1组(preText
(:除换行符之外的任何零个或多个字符,尽可能少((?:d{1,3}(?:,d{1,3})*|d+)(?:.d{1,5})?)
-第2组(number
(:一到三位数字后接零个或多个逗号和一到三个数字,或者只有一个或多个子数字,然后是.
和一到五个数字的可选序列(D.*)?
-第3组(postTex
(,可选:一个非数字字符,然后是除换行字符之外的任何零个或多个字符,尽可能多$
—字符串结束
关于模式的一些注意事项:
- 首先测试您的代码,这是错误消息:
未捕获语法错误:无效的正则表达式:/(([(?[0-9]{1,3}(?:,[0-9]}1,3(*(.[0-9]{1,5}(?((](?/:未终止的组
- 除此之外,您还必须对RegExp构造函数中的反斜杠进行双转义
- 括号之间有2000,它是4位数字,
[0-9]{1,3}
只能匹配1-3位数字 - 只有当两个
([
都存在时,像([
这样的模式才会匹配 - 模式与
$
或%
不匹配,因此无法在输出中
您可以使用像[$[(]
这样的字符类在左侧和右侧成组捕获所有可能的符号
([$[(]*)b((?:[0-9]{1,3}(?:,[0-9]{1,3})*(?:.[0-9]{1,5})?)|d+)b([])%]*)
Regex演示
或者可选地在匹配数字周围匹配所有非数字D*
:
(D*)b((?:[0-9]{1,3}(?:,[0-9]{1,3})*(?:.[0-9]{1,5})?)|d+)b(D*)
Regex演示
如果匹配,则捕获组号为1、2和3:
let data = '$(2000)%'
const regex = /([$[(]*)b((?:[0-9]{1,3}(?:,[0-9]{1,3})*(?:.[0-9]{1,5})?)|d+)b([])%]*)/;
const m = data.match(regex);
console.log(m);
if (m) {
preText = m[1];
// etc..
}