如何在全局范围内替换[字符]前面没有\的字符?

时间:2016-04-05 11:40:24

标签: javascript regex

例如,如果字符串x = "\\aa\\aa\\a" 结果应该看起来像"\a[a]\a[a]\a"

由于javascript没有看后面,我发现很难实现这一点。 :(

1 个答案:

答案 0 :(得分:4)

'\\aa\\aa\\a'.replace(/(\\)?(.)/g, function($0, $1, $2){
  return $1?$1+$2:'['+$2+']';
}); // "\a[a]\a[a]\a"

我们先走过字符串而不是字符(\\)?(.)

  • $1如果存在,则为\\;如果已被忽略,则为undefined
  • $2抓取(.)部分,例如任何角色。
    如果您也想使用双重转义,则可以将其替换为[^\\]

因此,我们只是分析$1并决定我们要选择的替代品: $1+$2保持输入不变或'['+$2+']'包装输入字符。

'\\aabc\\aa\\a'.replace(/(\\)?(([acl9#])|.)/g, function($0, $1, $2, $3){
return $1 ?               // have we escaped character?
          $1+$2:          // yes
          ($3?            // have we unescaped [acl9#] ?
             '['+$3+']':
             $2           // some other unescaped character
           );
});// "\a[a]b[c]\a[a]\a"

此外,您可以使用$0参数进行恢复:

// /(\\)?(?:([acl9#])|.)/g  
// (?: ) is uncaptured group
return $1 ? $0 : ($2 ? '['+$2+']' : $0);