我在使用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。”,但如果我必须的话。
感谢您的帮助!
答案 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")
<强>结果:强>
免责声明:我不是任何想象力的正则表达专家,所以完全有可能有更好的选择。但是,希望这有助于解释为什么当前表达式不按预期方式工作。
<强>更新强>
正如评论中所述,@ 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>