我正在使用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正则表达式是否确保交替运算符之间的匹配被顺序测试?因此,例如,第二个呼叫将永远不会在输入'\/\/'
时返回'@@'
?
答案 0 :(得分:2)
是的,顺序很重要。
正则表达式运算符将两种选择分开。模式首先尝试匹配左侧的Alternative(随后是正则表达式的后继);如果失败,它将尝试匹配正确的Disjunction(紧随其后的是正则表达式)。
MDN使用的措词更简单:
x|y
匹配“ x”或“ y”(如果“ x”不匹配)。