如何用正则表达式将符号与文本分离



我有一个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,603postText=

我无法用不同的变量来实现这一点,我如何才能获得所需的输出?

您可以使用

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..
}

最新更新