为什么regexp在diff senarios中有diff结果?

rxztt3cl  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(335)

简单地说,在node.js或浏览器中,运行以下代码:

const sep = '\\';
const regExpression = `/b\\${sep}|a\\${sep}/`;
const testCases = ['a\\abb\\abc','b\\'];
const regTest = new RegExp(regExpression);

console.log(`Result for ${testCases[0]} is ${regTest.test(testCases[0])}`)
console.log(`Result for ${testCases[1]} is ${regTest.test(testCases[1])}`)

两个输出均为false:error
但是,如果我改为:

const regExpression = `/c|b\\${sep}|a\\${sep}/`;

这两个结果都是真的……为什么?正确的
另一件有趣的事情是:匹配条件不可能总是第一个,以“/c|b${sep}| a${sep}/”为例,“c”将不匹配。。。。。

nlejzf6q

nlejzf6q1#

是因为正则表达式本身。

const regExpression = "/test/";
const regTest = new RegExp(regExpression);
console.log(regTest); // Regex: //test//

console.log(regTest.test("test")) // false
console.log(regTest.test("/test/")) // true

在第一种情况下 /b\\\\|a\\\\/ ->正则表达式-> //b\\|a\\// . 正则表达式将尝试查找 /b\\a\\/ . 因此,这两个值都将失败。

'a\\abb\\abc'  => FALSE
'b\\'          => FALSE
'a\\/abb\\abc' => TRUE (a\\/ coincidence) 
'/b\\'         => TRUE (/b\\ coincidence)

在第二种情况下 /c|b\\\\|a\\\\/ ->正则表达式-> /c|b\\|a\\/ . 正则表达式将尝试查找 /cb\\a\\/ .

'a\\abb\\abc'  => TRUE (b\\ coincidence)
'b\\'          => TRUE (b\\ coincidence)

因此,总之,您可以通过以下方式解决您的问题:

const regExpression = `b\\${sep}|a\\${sep}`;

这应该设法找到 b\\a\\ . 我不知道情况是否如此,但请记住 ^$ regex代币也是。您可以在regex101中进行测试。

相关问题