当前位置: 首页 > 知识库问答 >
问题:

为什么积极的前瞻性是有效的,而消极的前瞻性却不起作用?

袁泓
2023-03-14

首先,regex需要同时适用于python和PCRE(PHP)。我试图忽略正则表达式模式后面是否有字母“x”,以区分维度和下面给定示例中的字符串(如“number/number”):

dummy word 222/2334; Ø14 x Ø6,33/523,23 x 2311 mm

从这里,我试图提取222/2334,但不是6,33/523.23因为该部分实际上是维度的一部分。到目前为止,我想出了这个正则表达式

((\d*(?:,?\.?)\d*(?:,?\.?))\s?\/\s?(\d*(?:,?\.?)\d*(?:,?\.?)))(?=\s?x)

它可以提取我不希望它提取的内容,它看起来像这样。如果我将正面展望更改为负面,它会捕获除 6,33/523,23 中的最后一个“3”之外的两个。它看起来像这样。如何只能捕获 222/2334?我在这里做错了什么?

期望输出:

222/2334

我得到了什么

222/2334 6,33/523,2

共有2个答案

爱唯
2023-03-14

有两个简单的选择。

第一个选项很难看,很长,但基本上否定了字符串上的一个正匹配,后面是x,然后匹配没有它的模式。

(?! PATTERN(?=x))PATTERN

请在此处查看使用的正则表达式

(?!\d+(?:[,.]\d+)?\s?\/\s?\d+(?:[,.]\d+)?(?=\s?x))(\d+(?:[,.]\d+)?)\s?\/\s?(\d+(?:[,.]\d+)?)

第二个选项使用所有格量词,但是在python中,您必须使用< code>regex模块,而不是< code>re。

请在此处查看使用的正则表达式

(\d+(?:[,.]\d+)?+)\s?\/\s?(\d+(?:[,.]\d+)?+)(?!\s?x)

此外,我将子模式更改为\d (?:[,.]\d)?。这将匹配一个或多个数字,然后可选地匹配后跟一个或多个数字。

端木澄邈
2023-03-14

您可以将这个简化的正则表达式与负前瞻一起使用:

((\d*(?:,?\.?)\d*(?:,?\.?))\s?\/\s?(\d*(?:,?\.?)\d*(?:,?\.?)))\b(?![.,]?\d|\s?x)

更新的正则表达式演示

> < li>

务必在末尾使用单词边界,以避免匹配部分数字(这是正则表达式匹配到前一位数字的原因)

还包括[.,]?\d处于负先行条件,以便匹配不会在最后一个逗号之前的位置结束。

这种更短(更高效)的正则表达式也适用于OP:

(\d+(?:[,.]\d+)*)\s*\/\s*(\d+(?:[,.]\d+)*)\b(?![.,]?\d|\s?x)

RegEx演示2

 类似资料:
  • 我正在使用以下正则表达式; 匹配Lucene查询字符串; 第一个非捕获组不受尊重,并返回 _title 而不是 。使用积极的前瞻会使整个正则表达式无法匹配任何内容。 它应该返回以下数组:;

  • 我对正则表达式有很多困惑,我正在努力解决它们。这里有以下字符串: 我的两个不同正则表达式,其中我只更改了点的位置: 为什么第一个正则表达式吃最后一个“e”? 这个否定的前瞻性是如何使这个量词不贪婪的?我的意思是为什么它不能使用{end}之外的字符?

  • 问题内容: 这就是我正在做的事(简化示例): 我试图把所有不以开头的行放在前面。这是错误: 怎么了? 问题答案: 据我所知,既没有前瞻性,也没有落后。切换到具有类似语法的更强大的语言,例如。

  • 有时候我们需要匹配后面跟着特定模式的一段模式。比如,我们要从 1 turkey costs 30€ 这段字符中匹配价格数值。 我们需要获取 € 符号前面的数值(假设价格是整数)。 那就是前瞻断言要做的事情。 前瞻断言 语法为:x(?=y),它表示 “匹配 x, 仅在后面是 y 的情况"” 那么对于一个后面跟着 € 的整数金额,它的正则表达式应该为:\d+(?=€)。 let str = "1 tu

  • 我试图为PostgreSQL SQL定义lexer规则。 这里是PostgreSQL运算符的原始定义:

  • 问题内容: 我的elasticsearch的映射如下所示: 问题是: 我正在使用elasticsearch_dsl Q()形成ES查询。当我的查询包含任何复杂的正则表达式时,它在大多数情况下都可以正常工作。但是,如果它包含正则表达式字符“!”,则它将完全失败。在里面。当搜索词包含“!”时,不会给出任何结果 在里面。 例如: 1.)(完美运作) 2.)(完美运作) 3.)(完美运作) 4.)(完美运