【问题标题】:Regex Lookarounds, prevent matches before and after正则表达式环顾四周,防止前后匹配
【发布时间】:2015-06-17 15:29:44
【问题描述】:

我有一个无法正常工作的正则表达式。我正在使用 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

我通过 regex101.com 的调试器运行它,但仍然无法弄清楚。

【问题讨论】:

  • 你能否再添加几个例子让问题更清楚。

标签: php regex pcre


【解决方案1】:

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

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

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

Demo

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

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

第二部分也可以写成:

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

【讨论】:

  • @Paulo 当然,这就是我费心为它实现 .NET 绑定的原因:-)
猜你喜欢
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 2020-07-16
  • 2018-06-29
  • 2013-04-27
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多