【问题标题】:Escape brackets in a regex with alternation正则表达式中的转义括号与交替
【发布时间】:2021-02-17 01:42:59
【问题描述】:

我正在尝试编写一个正则表达式来匹配单词列表中的任何单词,但是我遇到了带括号的单词的问题。

这是我目前的 reg 表达式:

^\b(?:Civil Services|Assets Management|Engineering Works (EW)|EW Maintenance|Ferry|Road Maintenance|Infrastructure Planning (IP)|Project Management Office (PMO)|Resource Recovery (RR)|Waste)\b$

Civil Services 等带括号的单词匹配,但 Engineering Works (EW) 等带括号的单词不匹配。

我尝试过使用 \ 进行单转义和双转义 (\),但在测试带有括号的单词时,这两个选项似乎都没有返回匹配项。

如何也可以匹配带括号的单词?

【问题讨论】:

  • 显示minimal reproducible example。您使用哪种语言?
  • 目前我只是在regex101.com 上进行测试 上面的单词列表只是一个示例,但我打算在名为 Adaxes 的产品中使用它,并且我想根据列表执行操作的部门。如果 AD 部门匹配正则表达式 (...) 则创建邮箱。语法可能略有不同,但只是希望对如何转义括号有所了解。

标签: regex escaping brackets alternation


【解决方案1】:

问题是\b 不能以您想要的方式匹配单词边界,因为它前面有)word boundary 是与非单词字符或字符串结尾相邻的单词字符。单词字符是字母、数字或下划线;值得注意的是,) 不是单词字符。这意味着)\b 不会匹配后跟空格的括号,也不会匹配字符串末尾的括号。

最简单的解决方法是删除\bs。你实际上并不需要它们,因为你已经有了 ^$ 锚点:

^(?:Orange|Banana|Apple \(Red\)| Apple \(Green\)|Plum|Mango)$

或者,如果您想在更大的字符串中搜索,您可以使用lookahead 来查找非单词字符或字符串结尾。这基本上就是\b 所做的,只是我们只向前看,而不是向后看。

\b(?:Orange|Banana|Apple \(Red\)| Apple \(Green\)|Plum|Mango)(?=\W|$)

【讨论】:

  • 我不知道 OP 是否想要这个,但只需使用 (?<!\S)(?!\S) 代替 \b 字边界。这样,您只能将它们放置一次,在交替之外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2023-01-11
  • 1970-01-01
相关资源
最近更新 更多