Error[8]: Undefined offset: 17, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

.NET正则表达式中的“组”和“捕获”之间有什么区别?

您不会是第一个对此感到困惑的人。以下是著名的杰弗里·弗里德尔(Jeffrey
Friedl
)所说的话(第437页以上):

根据您的观点,它要么为比赛结果添加了有趣的新维度,要么使您感到困惑和膨胀。

进一步:

Group对象和Capture对象之间的主要区别在于,每个Group对象都包含一个Captures集合,这些Collections表示
该组在匹配过程中的所有 中间 匹配项以及该组匹配的最终文本。

几页后,这就是他的结论:

在了解了.NET文档并真正理解了这些对象的内容之后,我对它们有了不同的看法。一方面,这是一个有趣的创新[..];另一方面,它似乎增加了大多数情况下不会使用的功能的效率负担[..]

换句话说:它们非常相似,但是偶尔会碰巧有它们的用处。在长出另一头灰色胡须之前,您甚至可能喜欢Captures …


由于以上内容和其他文章中的内容均未真正回答您的问题,请考虑以下内容。将Captures视为一种历史跟踪器。当正则表达式匹配时,它从左到右遍历字符串(暂时忽略回溯),当遇到匹配的捕获括号时,它将存储在

$x
(x是任何数字)中,比方说

普通的正则表达式引擎在要重复捕获括号时会丢弃当前值

,并将其替换为新值。不是.NET,它将保留此历史记录并将其放置在.NET中
Captures[0]

如果我们将您的正则表达式更改为如下所示:

MatchCollection matches = Regex.Matches("{Q}{R}{S}", @"({[A-Z]})+");

您会注意到第一个

Group
有一个
Captures
(第一个组始终是整个匹配项,即等于
{S}
),第二个将保持
Captures
,即只有最后一个匹配组。然而,这里的渔获物,如果你想找到另外两个锁扣,他们在
{Q}
,它包含了所有中介捕获的
{R}

{S}
Captures

如果您想知道如何从多重捕获(仅显示最后一个匹配项与字符串中明显存在的单个捕获项)中获得收益,则必须使用关于最后一个问题的最后一句话:总比赛总有一个总夺球,不要将其与各个组混合使用。 捕获只是在小组内部有趣

[+++]。



)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
.NET正则表达式中的“组”和“捕获”之间有什么区别?_随笔_内存溢出

.NET正则表达式中的“组”和“捕获”之间有什么区别?

.NET正则表达式中的“组”和“捕获”之间有什么区别?,第1张

.NET正则表达式中的“组”和“捕获”之间有什么区别?

您不会是第一个对此感到困惑的人。以下是著名的杰弗里·弗里德尔(Jeffrey
Friedl
)所说的话(第437页以上):

根据您的观点,它要么为比赛结果添加了有趣的新维度,要么使您感到困惑和膨胀。

进一步:

Group对象和Capture对象之间的主要区别在于,每个Group对象都包含一个Captures集合,这些Collections表示
该组在匹配过程中的所有 中间 匹配项以及该组匹配的最终文本。

几页后,这就是他的结论:

在了解了.NET文档并真正理解了这些对象的内容之后,我对它们有了不同的看法。一方面,这是一个有趣的创新[..];另一方面,它似乎增加了大多数情况下不会使用的功能的效率负担[..]

换句话说:它们非常相似,但是偶尔会碰巧有它们的用处。在长出另一头灰色胡须之前,您甚至可能喜欢Captures …


由于以上内容和其他文章中的内容均未真正回答您的问题,请考虑以下内容。将Captures视为一种历史跟踪器。当正则表达式匹配时,它从左到右遍历字符串(暂时忽略回溯),当遇到匹配的捕获括号时,它将存储在

$x
(x是任何数字)中,比方说

普通的正则表达式引擎在要重复捕获括号时会丢弃当前值

,并将其替换为新值。不是.NET,它将保留此历史记录并将其放置在.NET中
Captures[0]

如果我们将您的正则表达式更改为如下所示:

MatchCollection matches = Regex.Matches("{Q}{R}{S}", @"({[A-Z]})+");

您会注意到第一个

Group
有一个
Captures
(第一个组始终是整个匹配项,即等于
{S}
),第二个将保持
Captures
,即只有最后一个匹配组。然而,这里的渔获物,如果你想找到另外两个锁扣,他们在
{Q}
,它包含了所有中介捕获的
{R}

{S}
Captures

如果您想知道如何从多重捕获(仅显示最后一个匹配项与字符串中明显存在的单个捕获项)中获得收益,则必须使用关于最后一个问题的最后一句话:总比赛总有一个总夺球,不要将其与各个组混合使用。 捕获只是在小组内部有趣



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5440920.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存