You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:正则表达式匹配符合特定前置后置规则的字符串

正则匹配关键词问题解决

需求

需要检查字符串是否满足以下任一情况:

  • 字符串以目标关键词开头或结尾
  • 字符串包含的关键词符合:
    • 前置为一个或多个字母+空格,或一个或多个字母+点
    • 后置为字母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]+`)

核心问题:

  1. 强制要求关键词后必须跟s?(-|\s)[A-Za-z0-9]+,导致单独的关键词或结尾的关键词无法匹配
  2. 前置部分未限制「必须有至少一个字母」,允许了单独的点前缀(如.Hansen)
  3. 未覆盖关键词作为字符串结尾的场景

正确的正则表达式

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 07:28:11