gpt4 book ai didi

正则表达式从组中排除字符

转载 作者:行者123 更新时间:2023-12-04 00:56:16 28 4
gpt4 key购买 nike

我有一个回应:

MS1:111980613994124 MS2:222980613994124

I have the following regex:

MS\d:(\d(?:\r?\n?)){15}

根据 Regex,“(?:\r?\n?)”部分应该让它与组匹配但将其排除在捕获之外(因此我从组)。

问题是对于“MS1:xxx”,它匹配[CR][LF] 并将其包含在组中。它应该被排除在捕获之外......

请帮忙。

最佳答案

(?:...) 语法意味着封闭的模式将从包含 (?:. ..).

这仅意味着由 (?:...) 形成的组将是一个非捕获组,而不是一个新的捕获组。

换句话说:

  • (?:...)
  • (...) 有两个功能:分组捕获

捕获组捕获与其包含的模式匹配的所有文本,甚至是与嵌套组匹配的部分(无论它们是否正在捕获)。

一个例子

使用正则表达式...

.*(l.*(o.*o).*l).*

...有两个捕获组。如果我们将其与 hello world 进行匹配,我们将获得以下捕获:

  • 1: lo worl
  • 2: o wo

请注意,组 2 捕获的文本也由组 1 捕获。

如果我们将内部组更改为非捕获...<​​/p>

.*(l.*(?:o.*o).*l).*

...第 1 组的捕获不会改变(当与相同的字符串匹配时),但不再有第 2 组:

  • 1: lo worl

如您所见,如果一个非捕获组包含在一个捕获组中,则该捕获组捕获与非捕获组匹配的字符。

它们的用途是什么?

非捕获组的目的不是从其他捕获组中排除内容,而是作为一种在不捕获的情况下对操作进行分组的方式。

例如,如果你想重复一个子字符串,你可以写成(?:substring)*

如何解决我的实际问题?

如果您真的想忽略嵌入的 \r\n,您最好的选择是在第二步中将它们去除。你没有说你使用的是什么语言,但是与此 (Python) 等效的东西应该可以工作:

s = re.sub(r'[\r\n]', '', s)

关于正则表达式从组中排除字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1209250/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com