Regex 不包含单词的ColdFusion正则表达式

Regex 不包含单词的ColdFusion正则表达式,regex,coldfusion,word,coldbox,Regex,Coldfusion,Word,Coldbox,我在使用ColdFusion 10构造正则表达式时遇到问题。如果URL在任何子域末尾包含“dev”且其中包含“mydomain.com”,则需要reFind()返回零 我在Adobe的文档中发现了以下内容: ()基于此,我尝试使用前瞻概念 本以为这样行得通,但事实并非如此: reFind("(?!dev)\.mydomain\.com$", "subdomaindev.mydomain.com") = 13 reFind("(?!dev)\.mydomain\.com$", "s

我在使用ColdFusion 10构造正则表达式时遇到问题。如果URL在任何子域末尾包含“dev”且其中包含“mydomain.com”,则需要reFind()返回零

我在Adobe的文档中发现了以下内容: ()基于此,我尝试使用前瞻概念

本以为这样行得通,但事实并非如此:

    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
这是我期望从(?=)得到的结果:

注意:这是用于ColdBox的环境配置的,我只能将一个正则表达式传递给一个名为“environments”的变量,然后该变量调用匹配环境的方法。我不希望在该方法中进行第二次检查以查找“dev.”,但如果必须的话,我会这样做


谢谢您的帮助

当不尝试查找内容时,正则表达式没有多大帮助

以下内容可能会为您提供一个正确的起点:

^((?!dev).)*$ 
如果在域中的任何位置找到(dev),则上述值将返回零。您可能需要使用它才能将其仅应用于子域部分

如果您可以添加自己的代码(这样您就不必使用正则表达式),您可以这样做。(这可能也更容易被某些人通过正则表达式理解):


#伊斯德夫#
(注释太长)

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

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

说实话,我也没有。然而,我遇到了一个似是而非的解释。要解释(使用您的值):

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

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

进一步搜索,亚当·卡梅隆(Adam Cameron)发表了一篇详细的博客文章。“负面外观”部分包含一个用于确认字符串不包含单词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$  

非常感谢你,这非常有效。从你的答案和链接的帖子中,我想我也理解了这里发生的事情。基本上,前瞻性搜索我不想要的整个领域,然后我搜索什么是可以接受的。“给我'*.mydomain.com',只要它不是域'*dev.mydomain.com',我的最后一个正则表达式是:^(?!dev\.mydomain\.com).*\.mydomain\.com$@zabuuq-刚刚注意到您的编辑。感谢您发布最终代码。我将更新答案,以便让下一个家伙更清楚地看到解决方案。谢谢。确实,regex不是为此而构建的。
^(?!.*CAT).*$
reFind("^(?!.*dev\.mydomain\.com$).*$","subdomain.mydomain.com")
reFind("^(?!.*dev\.mydomain\.com$).*$","subdomaindev.mydomain.com")
^(?!.*dev\.mydomain\.com).*\.mydomain\.com$