C#IndexOf,当单词是另一个单词的一部分时,如何?

C#IndexOf,当单词是另一个单词的一部分时,如何?,c#,string,C#,String,假设我有字符串“浸泡橡木”,我想有字符串索引(“橡木”),它返回我“橡木”开始于“浸泡”(1)的索引,但我想找到确切单词“橡木”(5)的索引,我需要做什么 string text = "soak oak"; char[] seperators = {' ', '.', ',', '!', '?', ':', ';', '(', ')', '\t', '\r', '\n', '"', '„', '“'}; string[] parts = text.Split(seperators

假设我有字符串
“浸泡橡木”
,我想有字符串
索引(
“橡木”
),它返回我
“橡木”
开始于
“浸泡”
1)的索引,但我想找到确切单词
“橡木”
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;
我们可以在循环中测试索引(
IndexOf
):


您可以使用正则表达式,也可以使用正则表达式定义的单词边界:

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);
}

您可以使用下面的正则表达式来查找字符串中的确切单词

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

5

请参见

通过将字符串转换为列表并使用IndexOf()方法,可以在数组中找到该字符串


它告诉您它是哪个数组项,而不是原始字符串中的索引。

另一种正则表达式方法-

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

希望有帮助。

您正在搜索字符串
文本
,而不是字符串[]
部分
。您已经完成了大部分操作。。。您已使用分隔符将文本拆分为多个部分。现在,您只需要检查这些部分中是否有任何部分是“橡木”,您需要为其实现一个算法。将所有字符放入数组,第2步。检查数组的第一个字母或空格以要查找的关键字开头后的字母。步骤3:在开始字母字符匹配时,循环连续字符以匹配其余关键字。第4步:如果找到了所有字符匹配,那么第一个字符索引就是您所需的答案!!您可以使用System.Text.RegularExpression命名空间。下面是一个使用正则表达式匹配整个单词的示例:。然后可以使用Regex.Match(文本“\boak\b”).Index。请参见此处:或者您可以使用“\boak\b”,它查找单词boundariesstring text=“浸泡橡木”;var match=Regex.match(文本@“\s[oak]”);if(match.Success){Console.WriteLine(match.Index);//4}
string text=“我能看到一只蟾蜍。”
Expected:13,实际:0@RobinBennett谢谢,我已将我的代码更新为您的建议
@“\b”+Regex.Escape(searchText)+@“\b”
,以便放在保险柜上side@DmitryBychenko,感谢改进,答案更新:)
[橡树]
在这里是不正确的:反例是
“橡树不是橡树”
@DmitryBychenko是的,你是对的。谢谢。但是这个怎么样,@“\s(橡树)”?
“橡树”
@\s(橡树)
的反例:我们不希望模式中有明确的
\s
;请看一下er shoaib的答案
5
parts.ToList().IndexOf("oak");
    string text = "soak oak";
    var match = Regex.Match(text, @"\s[oak]");
    if (match.Success)
    {
        Console.WriteLine(match.Index); // 4
    }