如何在字符串中的任何位置查找子字符串

时间:2014-11-30 16:42:15

标签: coldfusion coldfusion-11

这应该很容易,但我发现很难。

我只想查找子字符串是否存在于字符串中的任何位置。就我而言,网站的名称是否存在于产品的标题中。

我的代码是这样的:

#FindNoCase("Amazon.com", "Google Chromecast available at Amazon")#

以上返回0这是正确的,因为整个子字符串" Amazon.com"并不存在于主字符串中。但其中一些确实如此,即亚马逊"一部分。

我怎样才能实现我想要做的事情,只是看看主字符串中是否存在任何子字符串(长度至少超过2个字符)?

所以我需要像FindOneOf()这样的东西,但实际上"找到至少三个"。然后它应该看看"亚马逊"在产品标题中检查" Amazon.com"序列中是否至少有3个字符。存在。当它看到" Ama"存在,那么它只需返回true值。是否可以使用现有的内置函数以某种方式完成?

更新:非常简单的解决方案。我用左("亚马逊",3)。

2 个答案:

答案 0 :(得分:3)

假阳性有很多危险,比如有人买阿拉巴马州旗。

由于商店名称包含空格,这有点棘手(Wal Mart经常用空格写)。

如果您的字符串始终包含at [store],您可以通过查找句子中的最后一个并通过砍掉其他所有内容来创建字符串来提取商店名称。

因为它仅查找at个字词的出现次数,所以Beats AudioSam's Meat Shop等商店名称不存在危险。我想不出任何名字中带有单词at的商店。虽然这在技术上会使其绊倒,但风险要低得多,而且您可以对这些商店名称进行预先更换。

<cfset mystring = "Google Chromecast available at Amazon">
<cfset SellerName = REReplaceNoCase(mystring,".*\b(?:at)\b(?!.*\b(?:at)\b)\s*","")>
<cfoutput>Seller: #Sellername#</cfoutput>

然后,您可以更安全地进行比较。


根据您的评论,如果您了解所有可能的模式,您仍然可以获得数据(误报可能是令人尴尬或灾难性的,具体取决于行动)。如果你知道你正在使用的商店,你可以使用正则表达式来拉出像这样的字符串

<cfset mystring = "Google Chromecast available at Amazon.co.uk">
<cfset SellerName = REReplaceNoCase(mystring,".*\b((Google|Amazon|Wal[\W]*Mart|E[\W]*bay)(\.[a-z]+)*)\b","\1")>
<cfoutput>Seller: #Sellername#</cfoutput>

您需要更新的唯一部分是管道分隔列表您可以将K-Mart添加为K[\W]*Mart [\W]*允许任何特殊字符或空格,因此它涵盖了kMart,K-Mart,k * Mart,但不是Kwik-E-Mart。


更新#2,更多评论

<cfset mystring = "Google Chromecast available at Toys-R-US">
<cfset SellerNameRE = REReplace(rsProduct.sellername,"[\W]+","[\W]*","ALL")>
<cfset TheSellerName = REReplaceNoCase(mystring,".*\b((#sellernameRE#)(\.[a-z]+)*)\b","\1")>
<cfoutput>Seller: #TheSellername# (#SellerNameRE#)</cfoutput>

这将使用通配符替换任何符号,这样就不需要符号,这样如果某些内容显示为Wal * Mart,它仍将与WalMart匹配。

您还可以加载带有“Regex Names”的单独列,这样您每次都不会这样做。

所以你的表看起来像

SellerID    SellerName    RegexName
1           Wal-Mart      Wal[\W]*Mart
2           Toys-R-US     Toys[\W]*R[\W]*US

<cfset mystring = "Google Chromecast available at Toys-R-US">
<cfset TheSellerName = REReplaceNoCase(mystring,".*\b((#rsProduct.RegexName#)(\.[a-z]+)*)\b","\1")>
<cfoutput>Seller: #TheSellername# (#SellerNameRE#)</cfoutput>

答案 1 :(得分:0)

通过这样解决它

#FindNoCase(left("Amazon.com", 3), "Google Chromecast available at Amazon")#

是的,如果卖家名称长度少于3个字符,则可能无法满足我的要求。但我觉得它很少见。