2015-04-26 4 views
3

Я хочу найти строку для слова.Как искать слово в строке (просто слово)?

Однако я не хочу получать результат, если искомое слово находится внутри другого слова. Это

  • Я хочу, чтобы это вернуть номер 7 (индекс буквы F):

    findWord("Potato for you", "for")
  • , но я хочу, чтобы это вернуть -1 (т.е. не найден)

    findWord("Potato for you", "or")

Если я использую IndexOf, он найдет подстроку «или» внутри слова «для».

Есть ли простой способ сделать это?

Но это, очевидно, может не работать, если между словами есть несколько пробелов. Есть ли какой-либо заранее разработанный способ сделать эту, по-видимому, простую вещь, или я должен просто использовать Regex?

ответ

11

Вы можете использовать регулярное выражение:

var match = Regex.Match("Potato for you", @"\bfor\b"); 
if (match.Success) 
{ 
    int index = match.Index; 
    ... 
} 

\b указывает на границу слова.

Если вам не нужен указатель, но вы просто хотите проверить, находится ли слово в строке, вы можете использовать IsMatch, который возвращает логическое значение, а не Match.

+0

Это работает для вас «для вас» или «Картофель для»? Просто любопытно, что правила для '\ b'. – krillgar

+1

@krillgar, да. Начало или конец строки также считается границей слов. –

1

Если вы ищете индекс, вы можете сделать такой метод. Если вы хотите только bool независимо от того, находится ли он там, то метод будет немного проще. Скорее всего, может быть способ сделать это с помощью Regex проще, но они не мои сильные стороны.

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

public static int FindFullWord(this string search, string word) 
{ 
    if (search == word || search.StartsWith(word + " ")) 
    { 
     return 0; 
    } 
    else if (search.EndsWith(" " + word)) 
    { 
     return search.Length - word.Length; 
    } 
    else if (search.Contains(" " + word + " ")) 
    { 
     return search.IndexOf(" " + word + " ") + 1; 
    } 
    else { 
     return -1; 
    } 
} 
Смежные вопросы