如何使用负后视来排除分数?

How can I use negative lookbehind to exclude fractions?

我有一个测量列表,需要将其分解为数量(数字)和单位(字符串)。像

这样的东西
1 gal.
500lbs
none
2.25gal
4feet twine
2lbs regular and 2lbs lite

使用 \d+(\.\d+)? 一切都很好,但现在我有一小部分投入其中:

3/4gal

我需要从这次搜索中排除分数,以便我可以单独处理它。我通过插入负前瞻成功地排除了分子 (3)-- \d+(?!\/)(\.\d+)?,但我不知道如何排除分母 (4)。我想我应该使用负面回顾,但我不知道该怎么做。 \d+(?!\/)(?<!\/)(\.\d+)?\d+(?!\/)(\.\d+)?(?<!\/) 仍然匹配 4.

谢谢!

在这样的构造中 \d+(?!\/)(?<!\/)(\.\d+)? 后视 (?<!\/) 始终为真,因为您之前唯一可以匹配(而不是断言)的是数字。

您也可以排除数字部分左侧的/,并在匹配小数部分后添加向前看。

(?<!/)\d+(?:\.\d+)?(?!/)

说明

  • (?<!/) 否定lookbehind,直接断言当前位置左边不是/
  • \d+ 匹配 1+ 个数字
  • (?:\.\d+)? 匹配可选的 . 和 1+ 位数字
  • (?!/) 否定lookahead,直接断言当前位置右边不是/

regex demo

您可以匹配并跳过所有出现的 [digits]/[digits] 模式:

\d+\/\d+(*SKIP)(*F)|\d+(?:\.\d+)?

参见regex demo

\d+\/\d+(*SKIP)(*F)|部分匹配一个或多个数字,/,一个或多个数字,然后(*SKIP)(*F)使正则表达式引擎匹配失败并开始搜索下一个匹配从失败的位置开始,所以 3/5-like 子串将不会弄乱你的输出。