2014-11-30 2 views
2

Это должно быть легко, но мне сложно.Как найти подстроку где угодно в строке

Я просто хочу найти, существует ли подстрока в любом месте строки. В моем случае, существует ли название названия сайта в названии продукта.

Мой код выглядит так:

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

Вышеприведенные возвращает 0, который является правильным, потому что вся подстрока «Amazon.com» не существует в основной строке. Но некоторые из них, а именно часть «Амазонки».

Как я могу достичь того, что я пытаюсь сделать, который просто видит, существует ли в основной строке ЛЮБОЙ из подстроки (длиной не менее 2 символов)?

Так что мне нужно что-то вроде FindOneOf(), но на самом деле «найти как минимум три». Затем следует посмотреть слово «Amazon» в названии продукта и проверить, существует ли как минимум 3 символа в последовательности «Amazon.com». Когда он видит, что «Ama» существует, тогда ему просто нужно вернуть значение true. Можно ли это сделать, используя существующие встроенные функции?

Обновление: Очень простое решение. Я использовал Left («Amazon», 3).

+0

Что вернется? Любое число, отличное от 0, означает, что это совпадение. Он должен вернуть что-то около 25 (позиция 'Amazon' начинается в строке. –

+0

Мне очень жаль, я неправильно ввел значения. Я обновил сообщение, чтобы показать правильные значения. –

+1

Вы ищете' Amazon. com', и это не в строке. –

ответ

0

решаемые его, делая это

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

Да есть потенциал не будет делать то, что мне нужно в тех случаях, когда имя продавца менее 3 символов. Но я думаю, что его достаточно редко, чтобы быть в порядке.

3

В ложных срабатываниях существует большая опасность, например, если кто-то покупает государственный флаг штата Алабама.

Из-за названий магазинов, содержащих пробелы, это немного сложно (Wal Mart часто записывается с пробелом).

Если ваша строка всегда содержит at [store], вы можете извлечь имя магазина, найдя последнее в предложении и создав строку, отрубив все остальное.

Потому что он ищет вхождения at только как целое слово, нет никакой опасности с именами магазинов, такими как Beats Audio, или Sam'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.


Update # 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> 
+0

К сожалению, она не всегда заканчивается на «at storename». Она может быть по линии «Amazon Prime» теперь на 50% выше. Таким образом, вместо Amazon у нас есть название. –

+0

@volumeone Посмотреть мое редактирование, это все еще возможно. Хотя опять-таки возможны ложные срабатывания (он подберет последний матч. В строке «Google продает Amazon Kindle» он заберет Amazon. , если вы измените самый первый '. *' на '. *?', он подберет Google. –

+0

Это действительно интересно. Имя продавца и ProductTitle действительно поступают из набора записей cfquery. Итак, как я могу реализовать регулярное выражение, чтобы проверять значение в 'rsProduct.SellerName', а не' Google \ Amazon \ Wal [\ W] * Mart' и т. Д.? Извините, мои навыки регулярного выражения очень простые –

Смежные вопросы