【问题标题】:ColdFusion regular expression excluding a wordColdFusion正则表达式不包括一个词
【发布时间】:2015-11-05 18:38:29
【问题描述】:

我在使用 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.”,但如果必须,我会这样做。

感谢您的帮助!

【问题讨论】:

    标签: regex coldfusion word coldbox


    【解决方案1】:

    (对于 cmets 来说太长了)

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

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

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

    look-aheads 从它们所在的角色向前看—— 并且您已将其放在. 之前。所以,你得到的实际上是 说“任何以.mydomain.com 结尾的东西,只要前三个字符 从那个位置开始 (.my) 不是 dev" 这总是正确的。

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

    进一步搜索发现了 Adam Cameron 关于regular expressions and look arounds 的详细博客文章。 “Negative look-aheads”部分包含一个用于确认字符串是否包含单词 CAT 的表达式示例:

    ^(?!.*CAT).*$
    

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

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

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

    结果:

    • 0 ==> "subdomaindev.mydomain.com"
    • 1 ==> "subdomain.mydomain.com"

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


    更新:

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

    ^(?!.*dev\.mydomain\.com).*\.mydomain\.com$  
    

    【讨论】:

    • 非常感谢,这非常有效。从您的回答和链接的线程中,我想我也了解这里发生了什么。基本上,前瞻搜索整个我不想要的域,然后我搜索可接受的域。 “只要不是域 '*dev.mydomain.com',就给我 '*.mydomain.com' 我最后的正则表达式是这样的:^(?!.*dev\.mydomain\.com).*\.mydomain \.com$
    • @zabuuq - 刚刚注意到您的编辑。感谢您发布最终代码。我将更新答案,以便下一个人更容易看到解决方案。
    【解决方案2】:

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

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

    ^((?!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>
    

    【讨论】:

    • 谢谢。确实,正则表达式并非天生就是为此而构建的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多