ColdFusion正则表达式不包括单词

时间:2015-08-12 23:52:50

标签: regex coldfusion word coldbox

我在使用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

我在Adobe的文档中找到了以下内容: (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的环境配置,我只能将单个正则表达式传递给名为“环境”的变量,然后该变量调用匹配环境的方法。我宁愿不再用该方法检查“dev。”,但如果我必须的话。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

(评论太长)

  

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

     

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

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

  

前瞻性从他们所处的角色向前看 -   并且你已将它放在.之前。所以,你实际上得到了什么   说"任何以.mydomain.com结尾的东西,只要前三个字符   从那个位置开始(.my)不是dev"这总是如此。

..或者在(?=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 ==&gt; &#34; subdomaindev.mydomain.com&#34;
  • 1 ==&gt; &#34; subdomain.mydomain.com&#34;

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

<强>更新

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

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

答案 1 :(得分: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>