【问题标题】:multiple assertions in regex with word boundaries正则表达式中带有单词边界的多个断言
【发布时间】:2020-08-07 21:04:45
【问题描述】:

我正在尝试使用单词边界编写正则表达式模式。我想匹配这样的东西 \b(\d+)\/(\d+)\b 匹配 3/4 2/3 1/2 虽然我不想匹配分数旁边的数字 3 2/3 我希望这是无效的。我知道我可以使用^some pattern...$,所以3 2/3 是无效的。虽然,我希望能够在一行中有多个匹配项,这就是我使用单词边界的原因。我想要像3/4 2 2/3 hello 4/5 some text 这样只有3/4 4/5 有效的东西。我怎样才能用正则表达式来完成呢?

【问题讨论】:

  • 您使用哪种语言或正则表达式引擎?

标签: regex


【解决方案1】:

由于您已经在使用捕获组,因此您可以匹配一个数字后跟一个您不想保留的分数。

然后使用交替,并捕获您想要保留的整个组中的分数部分。

您的值在第 1 组中。

\b\d+ +\d+\/\d+\b|\b(\d+\/\d+)\b

说明

  • \b\d+ +\d+\/\d+\b 匹配 1+ 个数字后跟一个小数
  • | 或者组1抓拍骨折
  • \b(\d+\/\d+)\b

Regex demo


如果支持带有量词的环视,另一种选择是匹配一个分数并断言直接在左边的不是 1+ 数字后跟一个空格,该空格本身在左边有一个空白边界。

(?<!(?<!\S)\d+ +)\b\d+\/\d+\b

Regex demo


注意关于使用word boundaries \b @CarySwoveland 指出的是分数将在a7 3/4 中匹配,在agent:7 3/4 中不匹配,因为没有单词边界在a7 之间,:7 之间有一个单词边界。看到这个regex demo

【讨论】:

  • 很好的解决方案。 (我最初以某种方式认为,如果一个数字在它之前,即使有中间字符,也应该忽略分数。愚蠢,愚蠢,愚蠢。但我不是在发表评论来表达我的困境。)我不相信有一个论点用于限制紧接在一个或多个数字之前的内容,后跟空格,后跟小数。例如,您在 "a7 3/4" 中匹配 "3/4",但在 "agent:7 3/4" 中不匹配。次要:您可以将\d+ \d+ 替换为\d+ +\d+
  • @CarySwoveland 很好,这是一个极端情况,我认为可能还有更多。 OP提到了一个单词边界,所以我想到了使用它。我会做一个关于使用单词边界的注释。
  • 谢谢,我肯定需要了解更多关于lookbehind的知识
猜你喜欢
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2018-07-09
相关资源
最近更新 更多