首页 > 解决方案 > 这可以用正则表达式完成吗?在字符串中找到我的密钥

问题描述

我有正则表达式/[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}/gm来匹配这样的关键模式AAAAA-AAAAA-AAAAA

现在我想修改这个正则表达式以匹配这些示例中的键模式:

"AAAAA-AAAAA-AAAAA",
"dasd:AAAAA-AAAAA-AAAAA.ds",
"AAAAA-AAAAA-AAAAA:dsad",
"das.AAAAA-AAAAA-AAAAA",
"df:AAAAA-AAAAA-AAAAA:das",
"AAAAA-AAAAA-AAAAA asdas",
"dsad adf AAAAA-AAAAA-AAAAA",
"AAAAA-AAAAA-AAAAA adasd asd"

但是在这些例子中没有得到匹配:

"AAAAA-AAAAA-AAAAA-aaaaaaa",
"sadasAAAAA-AAAAA-AAAAA",
"AAAAA-AAAAA-AAAAAdasd",
"dsa-AAAAA-AAAAA-AAAAA-das",
"adsAAAAA-AAAAA-AAAAAasd"

所以描述是:如果[a-zA-Z0-9]or-在关键模式之前或之后,我不想匹配它。

我尝试了类似的方法,(^[a-zA-Z0-9])?[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}(^[a-zA-Z0-9])?但没有奏效。

这可以只用正则表达式完成还是我需要额外的代码?

标签: javascriptregex

解决方案


\b您可以在左右两侧使用单词边界来防止部分匹配,并在模式的末尾使用否定前瞻(?!-)来断言当前位置左侧不是连字符。

\b[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}\b(?!-)

正则表达式演示

const regex = /\b[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}-[a-zA-Z0-9]{5}\b(?!-)/;
[
  "AAAAA-AAAAA-AAAAA",
  "dasd:AAAAA-AAAAA-AAAAA.ds",
  "AAAAA-AAAAA-AAAAA:dsad",
  "das.AAAAA-AAAAA-AAAAA",
  "df:AAAAA-AAAAA-AAAAA:das",
  "AAAAA-AAAAA-AAAAA asdas",
  "dsad adf AAAAA-AAAAA-AAAAA",
  "AAAAA-AAAAA-AAAAA adasd asd",
  "AAAAA-AAAAA-AAAAA-aaaaaaa",
  "sadasAAAAA-AAAAA-AAAAA",
  "AAAAA-AAAAA-AAAAAdasd",
  "dsa-AAAAA-AAAAA-AAAAA-das",
  "adsAAAAA-AAAAA-AAAAAasd"
].forEach(s => {
  const match = s.match(regex);
  console.log(match ? `${s} --> ${match[0]}` : `${s} --> No match`);
})


推荐阅读