JavaScript中如何正确校验字符串是否匹配指定正则表达式
问题原因
- 你的正则没有添加首尾锚点
^和$,RegExp.test()只要检测到字符串中存在任意一段匹配规则的子串就会返回true,不会校验整个字符串是否完全符合规则。 - 你用
.*?匹配双引号内部内容,会匹配到双引号本身,导致引号闭合的逻辑完全失效,比如test3中的"hello; "会被判定为符合规则的片段,直接返回true。
修正方案
使用如下正则即可满足需求:
const regex = /^"[^"]*"(?:; *"[^"]*")*;?$/;
各部分规则说明:
^:匹配字符串开始位置,确保从开头就符合规则"[^"]*":匹配一对合法的双引号结构,[^"]*表示匹配除双引号外的任意字符,避免内部出现未转义的双引号(?:; *"[^"]*")*:非捕获组,匹配0次或多次「分号 + 任意个空格 + 合法双引号结构」的组合,对应多段内容用分号分隔的规则;?$:匹配末尾可选的分号,$确保校验到字符串结束位置,没有多余内容
测试效果
修改后运行你的测试代码,输出完全符合预期:
const regex = /^"[^"]*"(?:; *"[^"]*")*;?$/; const test = `"hello"; "world";`; const test2 = `"hello"; "world"`; const test3 = `"hello; "world"`; const test4 = `"hello"; world`; const test5 = `"hello""world"`; //should be true console.log("test1",regex.test(test)); // true console.log("test2",regex.test(test2)); // true //should be false console.log("test3",regex.test(test3)); // false console.log("test4",regex.test(test4)); // false console.log("test5",regex.test(test5)); // false
如果你的场景允许双引号内部存在转义的双引号(比如"he\"llo"),可以把正则调整为/^"[^"\\]*(?:\\.[^"\\]*)*"(?:; *"[^"\\]*(?:\\.[^"\\]*)*")*;?$/即可支持转义字符。
内容的提问来源于stack exchange,提问作者Charles Lavalard
相关产品推荐
相关产品推荐

