在下面的代码中,我有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的安全方法)。
答案 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)