代码之家  ›  专栏  ›  技术社区  ›  Paolo.Bolzoni

ecmascript正则表达式替换运算符(pipe)是否确保计算顺序?

  •  1
  • Paolo.Bolzoni  · 技术社区  · 8 年前

    我使用的是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 回复  |  直到 8 年前
        1
  •  2
  •   cнŝdk    8 年前

    是的,订单很重要。

    Ecmascript

    正则表达式运算符分隔两个选项。模式首先尝试匹配左边的选项(后面是正则表达式的序列);如果失败,则尝试匹配右边的析取(后面是正则表达式的序列)。

    MDN 使用更简单的措辞:

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