2015-04-26 87 views
3

我想为一个字搜索一个字符串。如何搜索字符串中的单词(只是单词)?

但是,如果搜索到的单词在其他单词内,我不想得到结果。 也就是说

  • 我想这回7号(字母f的指数):

    findWord("Potato for you", "for")
  • ,但我想这个返回-1(即未找到)

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

如果我使用IndexOf,它会在单词“for”中找到子字符串“or”。

有没有简单的方法来做到这一点?

char[] terminationCharacters = new char[] { '\n', '\t', ' ', '\r' }; 

//get array with each word to be taken into consideration 
string[] words= s.Split(terminationCharacters, StringSplitOptions.RemoveEmptyEntries); 

int indexOfWordInArray = Array.IndexOf(words, wordToFind); 
int indexOfWordInS = 0; 
for (int i = 0; i <= indexOfWordInArray; i++) 
{ 
    indexOfWordInS += words[i].Length; 
} 
return indexOfWordInS; 

但是,如果单词之间有多个空格,这显然可能不起作用。 有没有预先建立的方式来做这个显然很简单的事情,或者我应该只使用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它是否在那里,那么这个方法会更简单一些。更可能的是,有一种方法可以用一个正则表达式来实现,但它们并不是我的特长。

我将它设置为扩展方法,使其更易于使用。

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; 
    } 
} 
相关问题