gpt4 book ai didi

regex - FQDN(不包括.arpa)的这个正则表达式如何工作?

转载 作者:行者123 更新时间:2023-12-01 08:29:35 24 4
gpt4 key购买 nike

我想了解正则表达式的工作原理。我一点一点地明白了。但是,我不完全理解这一点。它基本上是完全限定域名的正则表达式,但要求结尾不能是 .arpa

(?=^.{4,253}$)(^([a-zA-Z0-9]{1,63}\.)+[a-zA-Z]{2,63}[^.arpa]$)

https://regex101.com/r/hU6tP0/3

这与 google.uk 不匹配。如果我将其更改为:

(?=^.{4,253}$)(^([a-zA-Z0-9]{1,63}\.)+[a-zA-Z]{1,63}[^.arpa]$)

它再次工作。

但这也行

(?=^.{4,253}$)(^([a-zA-Z0-9]{1,63}\.)+[a-zA-Z]{2,63}$)

这是我的思考过程

?=^.{4,253}$)(^([a-zA-Z0-9]{1,63}\.)+[a-zA-Z]{2,63}[^.arpa]$)

我是这样看的

(?=

是积极的展望(有人可以向我解释这到底是什么意思吗?)据我现在的理解,它只是意味着字符串需要匹配正则表达式。

^.{4,253}$)

匹配所有字符,但长度必须在 4 到 253 个字符之间。

(^([a-zA-Z0-9]{1,63}\.)

启动一个捕获组并在其中创建另一个捕获组。这个捕获组表示每个非特殊字符可以被写入 1 到 63 次或者直到 . 被写入。

+

前面的捕获组可以无限重复,但它应该总是以 . 结尾。这样下一个捕获组就开始了。

[a-zA-Z]{2,63}

然后你可以写 a 到 z 的次数不限,但它必须在 2 到 63 之间。

[^.arpa]$)

最后一个字符不能是.arpa

谁能告诉我哪里出错了?

最佳答案

这并不像你想象的那样:

[^.arpa]

所有的意思是“以不是字母 apr. 之一的东西结尾”——它是一个否定的字符类。

您可能会想到 negative lookahead assertion :

(?!\.arpa)$

但是,如果您尝试在正则表达式中组合多个条件,我建议您可能使用了错误的工具来完成这项工作。由于贪婪/非贪婪匹配等原因,它最终变得复杂且难以调试。

您的“正/负”前瞻是匹配未被其他模式片段包围的模式片段。但是,如果您要匹配可变宽度,这可能会产生一些意想不到的结果,因为正则表达式引擎会回溯,直到找到匹配的东西

一个更简单的例子:

([\w.]+)(?!arpa)$

应用于:

www.test.arpa

会匹配吗?群里有什么?

... 它会匹配,因为 [\w\.]+ 会消耗所有它,然后前瞻将不会“看到”任何东西。

如果您使用:

([\w]+)\.(?!arpa)

相反 - 你会捕获...... www,但你不会匹配 test(例如 g 标志,因为 www 后面没有 .arpa,但是 test 有。

https://regex101.com/r/hU6tP0/5

因此,在模式中使用否定断言确实会变得复杂。我建议干脆不要这样做,并应用两个单独的测试。你很难理解, future 的维护程序员也很难理解!

关于regex - FQDN(不包括.arpa)的这个正则表达式如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34417190/

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