繁体   English   中英

如何使用 RegEx 查找同时包含数字和字母的括号,而不仅仅是一个或另一个

[英]How do I use RegEx to find parens that contain BOTH numbers and letters, not just one or the other

在这个例子中...

(5) (dogs)  (5 dogs)  (dogs 5)

我只想匹配...

(5 dogs)  -or-  (dogs 5)

这些数字可以是任意数量的数字,包含逗号、小数点、数学运算符、美元符号等。我唯一需要注意的是同时存在数字和字母字符。

我从hrs 提供的示例的修改开始,将其用于 RegEx ...

\(((letter).*(number))\)|((number).*(letter))\)

只捕捉这个......

(number letter)  -or-  (letter number)

但不是...

(number) (letter)

通过将表达式修改为...

\(((^[a-zA-Z]).*(^[0-9]))\)|((^[0-9]).*(^[a-zA-Z]))\)

...但显然我不知道我在做什么。

您可以使用前瞻来断言每组括号中都有一个数字和一个字母:

\((?=[^)\d]*\d)(?=[^)a-z]*[a-z])[^)]+\)

这两个前瞻断言有一些非右括号字符,然后是一个数字(第一个前瞻(?=[^)\d]*\d) )或一个字母(第二个前瞻(?=[^)az]*[az]) )。 [^)]+然后匹配()之间的字符。

正则表达式 101 上的演示

在 Javascript 中:

 const str = '(5) (dogs) (5 dogs) (dogs 5)' const regex = /\((?=[^)\d]*\d)(?=[^)az]*[az])[^)]+\)/ig console.log(str.match(regex))

作为具有单个前瞻的替代方案:

\((?=[^)a-z]*[a-z])[^\d)]*\d[^)]*\)

解释

  • \(匹配(
  • (?=正前瞻
    • [^)az]*[az]匹配除)或 az 以外的任何字符,然后匹配 az
  • )关闭前瞻
  • [^\d)]*\d匹配除数字或)以外的任何字符,然后匹配一个数字
  • [^)]*匹配除)以外的任何字符
  • \)匹配)

正则表达式演示

 const s = '(5) (dogs) (5 dogs) (dogs 5)'; const regex = /\((?=[^)az]*[az])[^\d)]*\d[^)]*\)/ig; console.log(s.match(regex));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM