首页 > 解决方案 > 正则表达式匹配两个字符之间任意位置的某些字符

问题描述

我想检测(并返回)括号内的任何标点符号。我正在查看的文本行将有多组括号(我可以假设它们的格式正确)。所以给出这样的东西:

[abc.] [!bc]. [.e.g] [hi]

我想检测所有这些情况并返回类似[[.], [!], [..]].

我试图这样做,/{.*?([.,!?]+).*?}/g但它返回了[hello], [hi]我不想匹配的 true !

我正在使用JS!

标签: regex

解决方案


您可以匹配方括号之间的子字符串,然后删除所有不是标点符号的字符:

const text = '[abc.] [!bc]. [.e.g]';
const matches = text.match(/\[([^\][]*)]/g).map(x => `[${x.replace(/[^.,?!]/g, '')}]`)
console.log(matches);

如果您需要让您的正则表达式完全了解 Unicode,您可以利用 ECMAScript 2018+ 兼容的解决方案,例如

const text = '[abc.] [!bc、]. [.e.g]';
const matches = text.match(/\[([^\][]*)]/g).map(x => `[${x.replace(/[^\p{P}\p{S}]/gu, '')}]`)
console.log(matches);

所以,

  • \[([^\][]*)]匹配一个介于[and之间的字符串],没有其他的[and ]inside
  • .replace(/[^.,?!]/g, '')删除除.,和,之外的所有字符?!
  • .replace(/[^\p{P}\p{S}]/gu, '')删除除 Unicode 标点符号和符号之外的所有字符。

推荐阅读