使用JavaScript正则匹配 有些不懂的地方

为什么我用正则匹配  得到的结果是 %26%26%26%26%26%26

  var regSymbol = /[&(?!nbsp;)]/ig;
  var str = ' '
  var str1 = '&小刘'
  var newStr = str.replace(regSymbol, '%26');

  console.log(newStr)

  var newStr1 = str1.replace(regSymbol, '%26');
  console.log(newStr1)

然后这么写又得到这个结果了%26bsp;

  var regSymbol = /&[(?!nbsp;)]/ig;
  var str = ' '
  var str1 = '&小刘'
  var newStr = str.replace(regSymbol, '%26');

  console.log(newStr)

  var newStr1 = str1.replace(regSymbol, '%26');
  console.log(newStr1)

实在有些不太明白

阅读 3k
2 个回答

你这纯属抓瞎啊
[]中括号是字符集,里面每个字符都会独立匹配
()圆括号是分组,里面的所有字符整体匹配

如楼上所说
1、[]是字符集,内部所有值会被当做普通字符使用,包括(),所以分组不能放到[]里面
2、()是分组,在正则表达式中可以通过$1~$99来获取分组的匹配值
3、(?!)是正向不匹配
/[&(?!nbsp;)]/能匹配到‘&’、‘(’、‘?’、‘!’、‘n’、‘b’、‘s’、‘p’、‘;’、‘)’这10个中的任何一个,所以用来匹配 会得到6个26%
/&[(?!nbsp;)]/能匹配到‘&(’、‘&?’、‘&!’、‘&n’、‘&b’、‘&s’、‘&p’、‘&;’、‘&)’这9个中的任何一个,所以用来匹配 时只会匹配到‘&n’,因此替换后就是%26bsp;

猜你的目的是要匹配所有&x中的x,但是排除 ,可以这样:

str.match(/(?<=&)\w+/g).filter(s => s != 'nbsp')
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题