排除单词的 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
我在 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 的环境配置,我只能将单个正则表达式传递给名为 "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$
我在使用 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
我在 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 的环境配置,我只能将单个正则表达式传递给名为 "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 notdev
" 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$