2012-03-13 3 views
0

У меня есть функция, которая принимает 2 параметра. Параметр 1: SEARCHTERM, Параметр 2: ProductNameЧтобы проверить соответствие слов в предложении с регулярным выражением C#

Как проверить, существует ли слова в SEARCHTERM в ProductName, не имеет значения, это происходит в начале, в середине или в конце ProductName?

Это должно быть словосочетание, скажем, SearchTerm = "cano", ProductName = "canon", оно должно быть возвращено false, а не совпадать.

ответ

4

Если вы хотите соответствовать только полным словам, то вам нужно word boundaries\b, чтобы добавить до и после вашего поискового запроса.

\b - утверждение о нулевой ширине, которое соответствует изменению от слова до символа, отличного от слова, или от неглавного слова до символа слова.

String term = "Foo"; 
String[] text = { "This contains Foo bar.", "Foo.", "Foobar", "BarFoo", "foo" }; 

Regex reg = new Regex(@"\b" + Regex.Escape(term) + @"\b"); 

foreach (var item in text) { 
    Match word = reg.Match(item); 
    if (word.Success) { 
     Console.WriteLine(item + ": valid"); 
    } 
    else { 
     Console.WriteLine(item + ": invalid"); 
    } 
} 

Выход:

Это содержит Foo бар. => действует
Foo. => Действует
Foobar => недействителен
BarFoo => недействителен
Foo => недействителен

-1

Вам не нужно регулярное выражение для простого поиска строк.

ProductName.Contains(searchTerm); 

http://msdn.microsoft.com/en-us/library/dy85x1sa.aspx

+2

Однако, он хочет, чтобы избежать таких вещей, как «может» быть найдено в предложении, когда «канон» в этом предложении , «.Contains» не избежит этого. –

+0

Вопрос был обновлен после того, как я ответил. :) – hungryMind

1

Потому что вы хотите, чтобы быть в состоянии определить, что это отдельная слово, а не к югу слово, вы должны будете использовать regexes.

Ваше регулярное выражение, вероятно, выглядеть следующим образом, если слово, которое вы ищете, хранится в переменной «лол»:

Regex regex1 = new Regex(lol + @"[^a-Z]"); // include grammar marks to avoid issues like "can." not matching 

По сути, вы хотите, чтобы попытаться соответствовать только это слово, и сделать уверен, что после него есть персонаж, который не является другой буквой. Таким образом, вы знаете, что это не другое слово.

Редактировать: Попробуйте эту красоту вместо этого. Выучил что-то сам.

string sPattern = @"\b" + lol + @"\b"; 

Here's some example usage.

Edit2: Похоже, Stema получил его первым. Here's the page I used, for reference.

+2

У вашего решения несколько проблем. Сначала он выбрасывает «Диапазон в обратном порядке», потому что «Z» предшествует «a». Другой способ «[Az]» также был бы неправильным, потому что между «Z» и «a» есть 6 небуквенных символов в таблице ASCII. Следующий вопрос: он будет терпеть неудачу, если после термина поиска будет конец строки и, наконец: что произойдет, если есть что-то перед термином в тексте? – stema

+0

Все прекрасные моменты.Я, очевидно, слишком поздно для себя. Позвольте мне посмотреть, смогу ли я это исправить, прежде чем я удалю сено. –

+1

+1 для улучшения вашего ответа (теперь это правильно) – stema

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