Ecmascript正则表达式交替运算符(管道|)是否确保评估顺序?

时间:2018-08-01 09:53:55

标签: javascript regex

我正在使用Javascript(如果重要,请使用版本5),并且必须将字符串存储在不允许使用斜杠的上下文中。存储时我不加思索地写道:

mystring.replace(/(\\)|(\/)|(@)/g, function(_,rbar,bar,at) {
  if (rbar) return '@';
  if (bar) return '@b';
  if (at) return '@@';
} );

及其加载时的相反方向:

mystring.replace(/(@@)|(@b)|(@)/g, function(_,at,bar,rbar) {
  if (at) return '@';
  if (bar) return '/';
  if (rbar) return '\/';
} );

显然很有效。

但是,我对此表示怀疑。 ecmascript正则表达式是否确保交替运算符之间的匹配被顺序测试?因此,例如,第二个呼叫将永远不会在输入'\/\/'时返回'@@'

1 个答案:

答案 0 :(得分:2)

是的,顺序很重要。

Ecmascript

  

正则表达式运算符将两种选择分开。模式首先尝试匹配左侧的Alternative(随后是正则表达式的后继);如果失败,它将尝试匹配正确的Disjunction(紧随其后的是正则表达式)。

MDN使用的措词更简单:

  

x|y匹配“ x”或“ y”(如果“ x”不匹配)。