簡體   English   中英

C#IndexOf,當單詞是另一個單詞的一部分時,該怎么做?

[英]C# IndexOf, when word is part of another word, How to?

假設我有一個字符串 "soak oak" ,我想擁有一個字符串index"oak" ),它向我返回了"oak""soak"1 )開始的索引,但是我想找到確切單詞的索引"oak"5 ),我需要做什么?

string text = "soak oak";
char[] seperators = {' ', '.', ',', '!', '?', ':',
        ';', '(', ')', '\t', '\r', '\n', '"', '„', '“'};
string[] parts = text.Split(seperators,
                        StringSplitOptions.RemoveEmptyEntries);
text.IndexOf("oak"); // gets '1' because "oak" is in "soak"
                     // but I want to get 5 because of exact word "oak"

正則表達式方法

string text = "soak oak";
int result = Regex.Match(text, @"\boak\b").Index;

您可以使用以下正則表達式在字符串中查找確切的單詞。

string text = "soak oak";
string searchText = "oak";
var index = Regex.Match(text, @"\b" + Regex.Escape(searchText) + @"\b").Index;

輸出:

5

觀看演示

我們可以在循環中測試索引( IndexOf ):

static HashSet<char> s_Separtors = new HashSet<char>() {
  ' ', '.', ',', '!', '?', ':', ';', '(', ')', '\t', '\r', '\n', '"', '„', '“'
};

private static int WordIndexOf(string source, string toFind) {
  if (string.IsNullOrEmpty(source) || string.IsNullOrEmpty(toFind))
    return -1;

  for (int index = source.IndexOf(toFind); 
       index >= 0; 
       index = source.IndexOf(toFind, index + 1)) {
    if (index < 0)
      return -1;

    if ((index == 0 || s_Separtors.Contains(source[index - 1])) &&
        (index >= source.Length - toFind.Length || 
         s_Separtors.Contains(source[index + toFind.Length])))
      return index;
  }

  return -1;
}

演示:

// 5
Console.Write(WordIndexOf("soak oak", "oak"));

您可以使用正則表達式,也可能會發現使用正則表達式定義的單詞邊界很有用:

string text = "soak oak";
var pattern = @"\boak\b";
var regex = new Regex(pattern);
foreach(Match m in regex.Matches(text)){
    Console.WriteLine(m.Index);
    Console.WriteLine(m.Value);
}

您可以通過將其轉換為列表並使用IndexOf()方法在數組中找到該字符串。

parts.ToList().IndexOf("oak");

那會告訴您它是哪個數組項,而不是原始字符串中的索引。

另一種RegEx方法-

    string text = "soak oak";
    var match = Regex.Match(text, @"\s[oak]");
    if (match.Success)
    {
        Console.WriteLine(match.Index); // 4
    }
  • \\ s 空白

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM