误报有很多危险,比如有人在购买阿拉巴马州的国旗。
由于商店名称包含空格,这有点棘手(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>