regex - 正则表达式匹配两个字符之间任意位置的某些字符
问题描述
我想检测(并返回)括号内的任何标点符号。我正在查看的文本行将有多组括号(我可以假设它们的格式正确)。所以给出这样的东西:
[abc.] [!bc]. [.e.g] [hi]
我想检测所有这些情况并返回类似[[.], [!], [..]]
.
我试图这样做,/{.*?([.,!?]+).*?}/g
但它返回了[hello], [hi]
我不想匹配的 true !
我正在使用JS!
解决方案
您可以匹配方括号之间的子字符串,然后删除所有不是标点符号的字符:
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 标点符号和符号之外的所有字符。
推荐阅读
- css - 获取 Mapbox 绘制形状为 CSS
- mongodb - MongoDB独立地从集合中聚合两个字段并计数
- excel - 将公式拖过去但保留字母并更改数字
- symfony - Doctrine QueryBuilder - ManyToMany - NOT IN - 如何仅过滤关系不包含 ID 的实体?
- c++ - K-Nearest Neighbors 程序总是报告相同的类值
- aws-lambda - spring cloud函数和api网关查询参数
- kotlin - 在 android studio 中,kotlin 文件路径不起作用
- microsoft-teams - 在桌面 1 中运行的 Microsoft Teams 中显示桌面 2
- reactjs - Typescript - 缩短重复 if 表达式的代码
- flutter - 从列表中过滤数据后,颤动的gridview bulder返回空白容器