4

我在使用 ColdFusion 10 构建正则表达式时遇到了麻烦。如果 URL 在任何包含“mydomain.com”的子域的末尾包含“dev”,我需要 reFind() 返回零。

    reFind(THE_REGEX, "subdomaindev.mydomain.com") needs to return 0
    reFind(THE_REGEX, "subdomain.mydomain.com") needs to return a positive number

我在 Adob​​e 的文档中找到了以下内容:(http://help.adobe.com/en_US/ColdFusion/10.0/Developing/WSc3ff6d0ea77859461172e0811cbec0a38f-7ffb.html)并基于此我尝试使用前瞻概念。

认为这会起作用,但它没有:

    reFind("(?!dev)\.mydomain\.com$", "subdomaindev.mydomain.com") = 13
    reFind("(?!dev)\.mydomain\.com$", "subdomain.mydomain.com") = 10

不明白为什么这两者都为零:

    reFind("(?=dev)\.mydomain\.com$", "subdomaindev.mydomain.com") = 0
    reFind("(?=dev)\.mydomain\.com$", "subdomain.mydomain.com") = 0

这是我对 (?=) 的预期结果:

    reFind("(?:dev)\.mydomain\.com$", "subdomaindev.mydomain.com") = 10
    reFind("(?:dev)\.mydomain\.com$", "subdomain.mydomain.com") = 0

注意:这是用于 ColdBox 的环境配置,我只能将一个正则表达式传递给一个名为“environments”的变量,然后该变量为匹配的环境调用一个方法。我不希望在该方法中进行第二次检查以找到“dev.”,但如果必须的话,我会的。

感谢您的任何帮助!

4

2 回答 2

1

(评论太长了)

不明白为什么这两者都为零

reFind("(?=dev)\.mydomain\.com$", "subdomaindev.mydomain.com") = 0

老实说,我也没有。但是,我遇到了这个线程,它提供了一个合理的解释。解释(使用你的价值观):

Look-aheads 从放置它们的角色向前看——并且您已将其放置在.. 因此,您实际上是在说“.mydomain.com只要从该位置 ( .my) 开始的前三个字符不是以结尾的任何内容dev”,这始终是正确的。

.. 或者在 的情况下(?=dev),总是假的,因为显然字符.my永远不可能等于dev

进一步搜索发现了 Adam Cameron 关于正则表达式和环顾四周的详细博客条目。“负前瞻”部分包含一个用于确认字符串不包含单词 CAT 的表达式示例

^(?!.*CAT).*$

博客条目提供了更好的解释,但本质上它利用^(start)、$(end) 和.*(零个或多个字符) - 来搜索整个字符串。而您当前的表达式仅搜索紧随其后的字符,即“.mydomain.com”。

如果我理解正确,您可以使用上述方法来确认提供的字符串不“dev.mydomain.com”结尾。只需将“CAT”更改为您要匹配的子字符串......错误......匹配。没有经过高度测试,但大致如下:

reFind("^(?!.*dev\.mydomain\.com$).*$","subdomain.mydomain.com")
reFind("^(?!.*dev\.mydomain\.com$).*$","subdomaindev.mydomain.com")

结果:

  • 0 ==> “subdomaindev.mydomain.com”
  • 1 ==> “subdomain.mydomain.com”

免责声明:无论如何,我都不是正则表达式专家,所以完全有可能有更好的选择。但是,希望这有助于解释为什么当前表达式没有按您预期的方式工作。


更新:

如评论中所述@zabuuq 的最终工作表达式是:

^(?!.*dev\.mydomain\.com).*\.mydomain\.com$  
于 2015-08-14T00:33:04.083 回答
0

不尝试查找内容时,正则表达式没有那么有用。

以下内容可能会让您朝着正确的方向开始:

^((?!dev).)*$ 

如果在域中的任何位置找到 (dev),上述将返回零。您可能必须使用它才能将其仅应用于子域部分。

如果您可以添加自己的代码(因此您不必使用正则表达式),您可以执行类似的操作。(通过正则表达式的人也可能更容易理解):

<cfset fqdn = "subdomaindev.mydomain.com">
<cfset subdomain = getToken(fqdn,1,".")>
<cfset isDev = (len(subdomain GTE 3) AND right(subdomain,3) EQ "dev")>

<cfoutput>
#isDev#
</cfoutput>
于 2015-08-13T01:05:55.477 回答