如何使用RegEx匹配同时包含数字与字母的括号内内容
匹配括号内同时包含数字和字母内容的正则方案
匹配规则说明
匹配判定唯一标准:
- 内容被英文圆括号包裹
- 括号内必须同时存在字母字符、数字字符(数字可附带逗号、小数点、数学运算符、美元符号等任意附属符号,只要存在数字位即可)
- 括号内仅含数字、仅含字母的内容不匹配
测试样例
待匹配文本:
(5) (dogs) (5 dogs) (dogs 5)
预期匹配结果:
(5 dogs) -or- (dogs 5)
原有写法问题
之前的正则写法有三个核心错误:
- 错误使用
^锚点:^代表字符串/行的起始位置,放在括号内的字符组前完全无法匹配括号中间位置的字符 - 没有做跨括号匹配限制:没有限定匹配范围在当前一对括号内部,容易出现跨多个括号匹配的错误
- 没有正确实现“同时存在两类字符”的判定逻辑
可用正则
直接匹配符合要求的完整括号内容,使用下面的正则即可:
\((?=[^)]*[A-Za-z])(?=[^)]*[0-9])[^)]+\)
规则拆解
\(:匹配左括号起始(?=[^)]*[A-Za-z]):正向预查,确认当前左括号到最近一个右括号的范围内,至少存在一个英文字母(?=[^)]*[0-9]):正向预查,确认当前左括号到最近一个右括号的范围内,至少存在一个数字字符(满足数字可带各类附属符号的要求,只要有数字位就符合判定)[^)]+:匹配括号内所有非右括号的内容,避免跨多组括号匹配\):匹配右括号结束
如果需要单独提取括号内部的内容,给内容部分加捕获组即可:
\((?=[^)]*[A-Za-z])(?=[^)]*[0-9])([^)]+)\)
提取第1个捕获组的内容,就能拿到括号里的文本。
匹配效果验证
- 可正常匹配:
(5 dogs)、(dogs 5)、($3.99 * 2 oranges)这类同时包含数字和字母的括号内容 - 不会匹配:
(123)、(dogs)、($100+200-50*0.5)这类仅含数字/符号无字母的内容,(apple_banana)这类仅含字母无数字的内容
内容的提问来源于stack exchange,提问作者Alan M.
相关产品推荐
相关产品推荐

