3

これは簡単なはずですが、難しいと思います。

文字列のどこかに部分文字列が存在するかどうかを調べたいだけです。私の場合、商品名にサイト名が入っているかどうか。

私のコードは次のようなものです:

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

0部分文字列「Amazon.com」全体がメイン文字列に存在しないため、上記は正しい a を返します。しかし、その一部、つまり「Amazon」の部分はそうです。

部分文字列のいずれか (少なくとも 2 文字以上の長さ) がメイン文字列に存在するかどうかを確認するだけで、私がやろうとしていることをどのように達成できますか?

したがって、FindOneOf() のようなものが必要ですが、実際には「少なくとも 3 つを見つける」必要があります。次に、製品タイトルの「Amazon」という単語を調べ、「Amazon.com」のシーケンスに少なくとも 3 文字が存在するかどうかを確認します。「Ama」が存在することがわかったら、true値を返すだけです。どういうわけか既存の組み込み関数を使用して実行できますか?

更新: 非常にシンプルなソリューションです。Left("amazon", 3) を使用しました。

4

2 に答える 2

3

誰かがアラバマ州の旗を購入した場合のように、誤検出には多くの危険があります。

スペースを含む店名のため、これは少し注意が必要です (ウォルマートはスペースで書かれることがよくあります)。

文字列に常に が含まれている場合at [store]は、文の最後の at を見つけて、他のすべてを切り取って文字列を作成することで、店舗名を抽出できます。

の出現箇所は単語全体としてのみ検索されるため、 、 、atなどのストア名には危険がありません。名前にアットという言葉が入っているお店が思い浮かびません。技術的にはつまずきますが、リスクははるかに低く、そのようなストア名を事前に置き換えることができます.Beats AudioSam's Meat Shop

<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 と一致します。

毎回これを行わないように、「正規表現名」を含む別の列をロードすることもできます。

したがって、テーブルは次のようになります

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 に答える