3

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

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

我的代码是这样的:

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

上面返回的 a0是正确的,因为主字符串中不存在整个子字符串“Amazon.com”。但其中一些确实如此,即“亚马逊”部分。

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

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

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

4

2 回答 2

3

误报有很多危险,比如有人在购买阿拉巴马州的国旗。

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

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

因为它只查找at整个单词的出现,所以商店名称没有危险,例如Beats Audio, 或Sam'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>
于 2014-11-30T18:41:44.623 回答
0

通过这样做解决了它

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

是的,如果卖家名称少于 3 个字符,它可能无法满足我的需求。但我认为它很少见,还可以。

于 2014-11-30T17:13:11.237 回答