求助:正则表达式匹配符合特定前置后置规则的字符串
正则匹配关键词问题解决
需求
需要检查字符串是否满足以下任一情况:
- 字符串以目标关键词开头或结尾
- 字符串包含的关键词符合:
- 前置为一个或多个字母+空格,或一个或多个字母+点
- 后置为字母s、连字符,或空格+字母数字字符
以关键词「Hansen」为例:
应匹配案例
const shouldMatchCases = [ "Hansen", "Studio Hansen", "Hansen-studio", "Hansen studio", "N.Hansen studio", "N.Hansen-studio", "N Hansens studio", "N Hansen studio", ];
不应匹配案例
const shouldNotMatchCases = [ "Hansenssutdio", "Hansenstest", "Hansenxxx", "NormanHansen", ".Hansen-studio", "Hansen-" ];
原正则的问题
尝试的正则无法匹配「Hansen」和「Studio Hansen」,还错误匹配「.Hansen-studio」:
const regex = new RegExp(`(?:\\b|^)(?:[A-Za-z]+\\.)?(${etternavn})s?(-|\\s)[A-Za-z0-9]+`)
核心问题:
- 强制要求关键词后必须跟
s?(-|\s)[A-Za-z0-9]+,导致单独的关键词或结尾的关键词无法匹配 - 前置部分未限制「必须有至少一个字母」,允许了单独的点前缀(如
.Hansen) - 未覆盖关键词作为字符串结尾的场景
正确的正则表达式
const regex = new RegExp(`^(?:[A-Za-z]+[.\\s])?${escapedKeyword}(?:s|-(?!$)|\\s[A-Za-z0-9]+)?$|\\b[A-Za-z]+[.\\s]${escapedKeyword}(?:s|-(?!$)|\\s[A-Za-z0-9]+)\\b`, 'i');
正则解析
^(?:[A-Za-z]+[.\\s])?${escapedKeyword}:匹配字符串开头的合法场景,可选前置为「字母+点/空格」(?:s|-(?!$)|\\s[A-Za-z0-9]+)?$:匹配关键词后的合法后缀,-(?!$)确保连字符后不能直接结束字符串;整个后缀部分可选,支持单独的关键词\\b[A-Za-z]+[.\\s]${escapedKeyword}(?:s|-(?!$)|\\s[A-Za-z0-9]+)\\b:匹配字符串中间的合法关键词,确保前置和后缀都符合规则escapedKeyword:转义关键词中的正则特殊字符,避免匹配异常i修饰符:忽略大小写匹配(可根据需求移除)
测试代码验证
function matchesPattern(str, keyword) { // 转义关键词中的正则特殊字符 const escapedKeyword = keyword.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); const regex = new RegExp(`^(?:[A-Za-z]+[.\\s])?${escapedKeyword}(?:s|-(?!$)|\\s[A-Za-z0-9]+)?$|\\b[A-Za-z]+[.\\s]${escapedKeyword}(?:s|-(?!$)|\\s[A-Za-z0-9]+)\\b`, 'i'); return regex.test(str); } // 测试用例 const shouldMatchCases = [ "Hansen", "Test Hansen", "Hansen-studio", "Hansen studio", "N.Hansen studio", "N.Hansen-studio", "N Hansens studio", "N Hansen studio", ]; const shouldNotMatchCases = [ "Hansenssutdio", "Hansenstest", "Hansenxxx", "NormanHansen", ".Hansen-studio", "Hansen-" ]; const keyword = "Hansen"; console.log(`测试关键词: '${keyword}' - 预期匹配:`); shouldMatchCases.forEach(str => { console.log(`${str}: ${matchesPattern(str, keyword)}`); }); console.log(`\n测试关键词: '${keyword}' - 预期不匹配:`); shouldNotMatchCases.forEach(str => { console.log(`${str}: ${matchesPattern(str, keyword)}`); });
测试结果
所有应匹配案例返回true,不应匹配案例返回false,完全符合需求。
内容的提问来源于stack exchange,提问作者mahan
相关产品推荐
相关产品推荐

