正则表达式环顾四周,防止前后匹配


Regex Lookarounds, prevent matches before and after

我有一个正则表达式,我无法正常工作。我正在使用PCRE(php)来运行它。

正则表达式使用正斜杠查找以分数形式写入的英寸测量值,以分隔分子和分母。 1 3/8in19 15/16"

它将与这里的12 1/2"匹配:

A product description with 12 1/2" in it.

但我希望它不匹配,如果测量是维度的一部分,即在之前或之后有一个x并匹配以下格式:19 3/4" x 19 5/8"

匹配不正确的示例文本:

Product description with 19 3/4" x 19 5/8" in it.

这与5/8"由于那里的x而应该忽略所有这些内容时相匹配。

我的正则表达式目前敲掉了x左侧的度量,但只忽略右侧的整数。后视将从上面的示例中捕获5/8"。我需要它忽略维度的两侧,只匹配本身的测量值。我使用负值向前和向后看以匹配x.

正则表达式:

/'s+(?<!x's)'d*'s?'d+'/'d+"*'s*(in|")(?!'d*'s?x)'s*/i

我通过正则表达式 101.com 的调试器运行它,但仍然无法弄清楚。

您可以使用(*SKIP)(*FAIL)技巧:

(?(DEFINE)(?<measure>
  (?:'d+ 's*)? 'd+ / 'd+ (?:in|")
))
(?&measure) 's* x 's* (?&measure) (*SKIP)(*FAIL)
| (?&measure)

演示

第一部分定义什么是度量值(您可以将其视为函数)。然后,如果我们找到两个用x(?&measure) 's* x 's* (?&measure))分隔的度量,我们在失败((*SKIP))时跳过输入字符串的这一部分,然后失败匹配((*FAIL))。

然后,替代方案的另一部分可以匹配您感兴趣的单个测量值。

第二部分也可以写成:

(?&measure) (?: 's* x 's* (?&measure) (*SKIP)(*FAIL) )?