如何匹配正则表达式分组与其对应的小写形式?
正则匹配需求实现方案
需求示例
匹配规则:冒号前为全大写字母串,冒号后必须是该串的全小写形式,具体示例如下:
# 匹配 AAAA: aaaa # 匹配 ABCD: abcd # 不匹配 AAAA: abcd # 不匹配 AAAA: AaAa
遇到的问题
之前找到的方案用到了\L语法,但它仅在PHP的正则替换场景生效,匹配时用不了,而且JavaScript完全不支持该语法。另外尝试的(\w+): \1,加不区分大小写选项后会错误匹配AAAA: AaAa,不符合需求。
JavaScript实现方案
由于JS正则没有直接在匹配时转换捕获组大小写的语法,需要结合正则匹配+字符串验证的方式实现:
1. 单行匹配验证
先匹配格式,再验证前后内容的大小写对应关系:
const checkMatch = (str) => { const regex = /^([A-Z]+): ([a-z]+)$/; const result = str.match(regex); return result && result[1].toLowerCase() === result[2]; }; // 测试示例 console.log(checkMatch("AAAA: aaaa")); // true console.log(checkMatch("ABCD: abcd")); // true console.log(checkMatch("AAAA: abcd")); // false console.log(checkMatch("AAAA: AaAa")); // false
2. 多行文本批量处理
遍历每一行,提取前后部分后验证:
const text = `AAAA: aaaa ABCD: abcd AAAA: abcd AAAA: AaAa`; const lineRegex = /^([A-Z]+): (.+)$/gm; let match; while ((match = lineRegex.exec(text)) !== null) { const [fullLine, prefix, suffix] = match; const isMatch = prefix.toLowerCase() === suffix && suffix === suffix.toLowerCase(); console.log(`${isMatch ? "匹配" : "不匹配"}:${fullLine}`); }
原理说明
- 先用正则
^([A-Z]+): ([a-z]+)$限定格式:前面是全大写字母,后面是全小写字母,确保基本格式符合要求; - 通过
prefix.toLowerCase() === suffix验证小写后的前缀和后缀完全一致,避免AAAA: abcd这种不对应的情况; - 额外判断
suffix === suffix.toLowerCase(),排除AAAA: AaAa这种后缀不全小写的情况。
内容的提问来源于stack exchange,提问作者Adrian
相关产品推荐
相关产品推荐

