Regex Lookarounds,防止之前和之后的匹配

时间:2015-06-17 15:29:45

标签: php regex pcre

我有一个正则表达式,我无法正常工作。我正在使用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"左侧的度量,但只忽略了右侧的整数。 lookbehind将从上面的示例中捕获x。我需要它忽略尺寸的两侧,只匹配它们自己的测量值。我正在使用负向前后匹配/\s+(?<!x\s)\d*\s?\d+\/\d+"*\s*(in|")(?!\d*\s?x)\s*/i

正则表达式:

txtArduino.setText("Data from Arduino: " + sbprint);  

我通过regex101.com的调试器运行它仍然无法解决它。

1 个答案:

答案 0 :(得分:1)

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

(?(DEFINE)(?<measure>
  (?:\d+ \s*)? \d+ / \d+ (?:in|")
))

(?&measure) \s* x \s* (?&measure) (*SKIP)(*FAIL)
| (?&measure)

Demo

第一部分定义了一个衡量标准(你可以把它想象成一个函数)。然后,如果我们发现两个度量由x(?&measure) \s* x \s* (?&measure))分隔,我们会在失败时跳过输入字符串的这一部分((*SKIP)),然后失败匹配((*FAIL) )。

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

第二部分也可以写成:

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