RegExp:使用交替运算符组合模式或多次执行正则表达式

时间:2016-07-10 13:56:21

标签: javascript regex

我需要一个字符串来匹配几个模式中的一个。什么被认为是更好的做法?在交替运算符|的帮助下组合模式:

const regexp = /(width)-(\d+)$|(height)-(\d+)$/
const matches = regexp.exec(string);

或者使用不同的模式多次执行正则表达式:

const regexp = /(width)-(\d+)$/
const regexp2 = /(height)-(\d+)$/
let matches = regexp.exec(string);
let matches2 = regexp.exec(string);

我喜欢的是,当多次执行正则表达式时,结果数组将始终具有相同的结构,而使用组合模式时,匹配高度宽度<的结果会有所不同/ strong>因为宽度将匹配前两个捕获括号,但高度最后两个。

例如,如果字符串为width-20,则结果为:

[ 'width-20',
  'width',
  '20',
  undefined,
  undefined,
  index: 0,
  input: 'width-20' 
]

对于height-20

[ 'height-20',
  undefined,
  undefined,
  'height',
  '20',
  index: 0,
  input: 'height-20' 
]

但从性能的角度来看,更好的方法是什么?

1 个答案:

答案 0 :(得分:0)

首先我认为第一个选项更快但是经过1E6迭代的一些测试后,我得出结论,在RegExp中使用OR较慢 ~30-40%

能够在75-99ms内解决100万次迭代

const regexp = /(width)-(\d+)$/
const regexp2 = /(height)-(\d+)$/
let matches = regexp.exec(string);
let matches2 = regexp.exec(string);

能够在120-140ms内解决100万次迭代

const regexp = /(width)-(\d+)$|(height)-(\d+)$/
const matches = regexp.exec(string);

修改

使用@nnnnnn赋予的第三个选项:

能够在110-125ms内解决100万次迭代

const regexp = /(width|height)-(\d+)$/
const matches = regexp.exec(string);