排除单词的 ColdFusion 正则表达式

ColdFusion regular expression excluding a word

我在使用 ColdFusion 10 构建正则表达式时遇到问题。如果 URL 在任何子域的末尾包含 "dev",我需要 reFind() 到 return 零"mydomain.com"在里面。

    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.",但如果必须的话,我会的。

感谢您的帮助!

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

以下内容可能会给您一个正确的开端:

^((?!dev).)*$ 

如果在域中的任何地方找到 (dev),以上内容将 return 归零。您可能需要尝试一下才能将其仅应用于子域部分。

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

<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>

(评论太长)

Don't understand why this gives zero for both

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

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

Look-aheads look forward from the character at which they are placed — and you've placed it before the .. So, what you've got is actually saying "anything ending in .mydomain.com as long as the first three characters starting at that position (.my) are not dev" which is always true.

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

进一步搜索发现了 Adam Cameron 关于 regular expressions and look arounds 的详细博客条目。 "Negative look-aheads" 部分包含一个用于确认字符串 包含单词 CAT:

的表达式示例
^(?!.*CAT).*$

博客条目提供了更好的解释,但本质上它利用 ^(开始)、$(结束)和 .*(零个或多个字符)来搜索整个 字符串。而您当前的表达式仅搜索紧随其后的字符,即“.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$