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

为什么积极的前瞻作为第一个捕获组不起作用?

甄胡非
2023-03-14

我正在使用以下正则表达式;

((?:_missing_:|_exists_:)[a-z0-9]+)|(([a-z0-9]+)(?=:))

匹配Lucene查询字符串;

_missing_:title age:(>=10 AND < 20) AND age:123 AND _exists_:title123

第一个非捕获组不受尊重,并返回 _missing_:title 而不是 title。使用积极的前瞻会使整个正则表达式无法匹配任何内容。

它应该返回以下数组:;

['title', 'age', 'age', 'title123']

共有2个答案

谷博艺
2023-03-14

你想要的不是一个前瞻,而是一个前瞻:(?

/(?<=_missing_:|_exists_:)([a-z0-9]+)|([a-z0-9]+)(?=:)/

测试。

现在,< code>([a-z0-9] )仅在后面有< code>_missing_:或< code>_exists_:时才匹配,但这些不是匹配的一部分。

第一个非捕获组受到尊重,当你:< code>/((?:_ missing _:| _ exists _:)[a-z0-9])/第一个组跨越整个< code>_missing_:title,第二个组是< code>_missing_:,但不会被捕获,并且< code>title不属于任何组。

但是,即使它没有被捕获,它仍然是匹配的,类似于 /(_missing_:[a-z0-9] )/。你想要的是捕获标题,所以你需要把它放在一个组(中:/(?:_missing_:|_exists_:)([a-z0-9] ))/。现在您有三个组:_missing_:title、_missing_:(未捕获)和标题

您可以将外部组设置为非捕获:/(?:(?:_missing_:| _exists:)([a-z0-9]))/,但没有必要,因为您实际上没有使用它,所以只需删除它:

/(?:_missing_:|_exists_:)([a-z0-9]+)/

现在第一组是title。然而,这仍然是比赛的一部分,这似乎不是你想要的。

要将其从匹配中删除,您需要积极的回溯:

/(?<=_missing_:|_exists_:)([a-z0-9]+)/

此外,由于在第二部分中使用了积极的前瞻,所以没有必要将其放在外部组中,所以只需:

([a-z0-9]+)(?=:)
周高畅
2023-03-14

像下面这样更改正则表达式,然后从组索引1和2中获取您想要的字符串。

(?:_missing_:|_exists_:)([a-z1-9]+)|([a-z1-9]+)(?=:)

您不需要在捕获组中包含非捕获组(?:_missing_:|_exists_:)。这就是返回缺少:title而不是title的原因。此外,为[a-z1-9]捕获组就足够了。

演示

 类似资料:
  • 首先,regex需要同时适用于python和PCRE(PHP)。我试图忽略正则表达式模式后面是否有字母“x”,以区分维度和下面给定示例中的字符串(如“number/number”): 从这里,我试图提取,但不是因为该部分实际上是维度的一部分。到目前为止,我想出了这个正则表达式 它可以提取我不希望它提取的内容,它看起来像这样。如果我将正面展望更改为负面,它会捕获除 中的最后一个“3”之外的两个。它看

  • 问题内容: 在下面的代码段中,匹配结果中的 非捕获组应被忽略, 结果应该是。 但是,我得到了匹配结果。仅当我指定group(2)时才显示。 问题答案: 并返回整个比赛。随后的组是实际的捕获组。 如果您想要相同的行为:

  • 我用pcregrep写了一个正则表达式,一切都按预期进行,直到我添加了一个积极的前瞻。 场景: 我有以下文本文件: 目标: 我想在pcregrep中使用Regex来返回包含的行和包含的行,以及它们之间包含的行未被捕获。因此,它将捕获前三行(、、)并返回第一行()和第三行()。它不会捕获第四行和第五行,因为它们之间没有行。因此输出将是: 我尝试过的 如果我运行 (命令 1),这将捕获并返回: 不出所

  • 问题内容: 我正在使用选择器为不同的社交图标添加背景图像。但是,所有图标都显示相同。我究竟做错了什么? 问题答案: 所述选择器计数的兄弟姐妹(即,元件具有相同父节点)。 在您的HTML结构中,始终是的第一个,最后一个也是唯一的孩子。因此只有一个要计数的元素。 但是,存在多个锚元素,所有锚元素都是同级(的子级),因此可以针对每个锚元素。

  • 问题内容: 我正在尝试从JSON网址获取集合。骨干网确实发送了请求并得到了响应,但是在它之后的集合中没有: 这是我的JavaScript: 响应中的JSON 响应中的Content-Type HTTP标头为。 为什么不将其加载到集合中?JSON是否正确? 一些更多的代码: 问题答案: 是异步的。尝试 要么 要么

  • 问题内容: 我有三部分字符串,每个部分用 符号分隔 。例如, 现在,当我使用这样的方法拆分它时: 它包含整个字符串作为单个元素的数组。 但是当我使用这个: 它完美的作品是什么,我想这意味着 现在的数组包含,并分别对指数0,1和2。 我想知道为什么第一次使用时不起作用,因为我在使用 问题答案: 因为字符是在正则表达式中用来标记行尾的保留令牌。因此,您必须使用进行 转义。