我怎样才能将正则表达式的后面转换为js安全?

时间:2018-10-10 01:56:08

标签: javascript google-chrome firefox regex-lookarounds

在下面的代码中,我有r =我的正则表达式。然后针对给定的s字符串对其进行测试,以查找匹配项,该匹配项在@和空格之间找到第一个包含的子字符串,其中@必须或者开始测试字符串,或者必须跟随空格。

const test = (s) => {
  let r = /(?<=^@|\s@)[^\s]+/g;
  let a = r.exec(s);
  if (a)
    console.log(`given: ${s}, found: ${a[0]}`);
  else
    console.log(`given: ${s}, no match found.`);
}

test("@abc"); // match = 'abc'
test("abc @def"); // match = 'def'
test("abc@def"); // no match
test("@abc@def"); // match = 'abc@def'
test("abc@def @ghi"); // match = 'ghi'
test("abd def"); // no match
test("@abd @def"); // match = 'abc' (only)

问题是,尽管它在Chrome中有效,但在Firefox中却无法使用(SyntaxError:无效的regexp组),因此?<= lookbehind并不安全。可以通过打开chrome和firefox进行测试,请转到codepen.io。将代码粘贴到JS区域中。并在Chrome中查看Codepen控制台(将看到结果),而Firefox开发工具控制台将看到错误,并且在Codepen控制台中没有结果。

有人可以建议我如何将其转换为js安全的,但仍能正常工作。

注意(?:^ @ | \ s @)[^ \ s] +接近,但它匹配的内容包含@和任何前导空格。 (是的,可以很容易地替换,但是我想知道是否存在使用js的安全方法)。

1 个答案:

答案 0 :(得分:0)

请使用非捕获组代替@。然后,在组中捕获以下非空格字符。对于您的匹配对象,如果它不为null,则打印第[1]个索引将为您提供该捕获组的内容。

请确保不要使用全局标志(至少不使用此实现)-使用/g,您将获得所有完全匹配项的数组,但是没有有关捕获的组。

还要注意,[^\s]简化为\S(任何非空白字符):

const test = (str) => {
  const regex = /(?:^@|\s@)(\S+)/;
  const match = str.match(regex);
  if (match) {
    console.log(`given: ${str}, found: ${match[1]}`);
    }
  else
    console.log(`given: ${str}, no match found.`);
}

test("@abc");          // match = 'abc'
test("abc @def");      // match = 'def'
test("abc@def");       // no match
test("@abc@def");      // match = 'abc@def'
test("abc@def @ghi");  // match = 'ghi'
test("abd def");       // no match
test("@abd @def");     // match = 'abc' (only)