精确值匹配的索引

时间:2012-03-22 19:57:29

标签: c#

环境:微软视觉工作室2008 c#

如何获取字符串中找到的整个单词的索引

string dateStringsToValidate = "birthdatecake||birthdate||other||strings";
string testValue = "birthdate";

var result = dateStringsToValidate.IndexOf(testValue);

它也不一定是我做的方式,例如,使用正则表达式或其他方法会更好吗?

更新 这个词是生日,而不是生日蛋糕。它不必检索匹配,但索引应该找到正确的单词。我不认为IndexOf是我正在寻找的东西。很抱歉不清楚。

2 个答案:

答案 0 :(得分:8)

为此

使用正则表达式
  string dateStringsToValidate = "birthdatecake||birthdate||other||strings";
  string testValue = "strings";
  var result = WholeWordIndexOf(dateStringsToValidate, testValue);

// ...

public int WholeWordIndexOf(string source, string word, bool ignoreCase = false)
{
  string testValue = "\\W?(" + word + ")\\W?";

  var regex = new Regex(testValue, ignoreCase ? 
         RegexOptions.IgnoreCase : 
         RegexOptions.None);

  var match = regex.Match(source);
  return match.Captures.Count == 0 ? -1 : match.Groups[0].Index;
}

详细了解c#here

中的正则表达式选项

根据您的需要,另一个选项是分割字符串(因为我看到你有一些分隔符)。请注意,此选项返回的索引是按字数计算的索引,而不是字符数(在本例中为1,因为C#具有基于零的数组)。

  string dateStringsToValidate = "birthdatecake||birthdate||other||strings";
  var split = dateStringsToValidate.Split(new string[] { "||" }, StringSplitOptions.RemoveEmptyEntries);
  string testValue = "birthdate";
  var result = split.ToList().IndexOf(testValue);

答案 1 :(得分:0)

如果你必须处理给定字符串中的确切索引,那么这对你没用。如果您只想在字符串中找到最佳匹配,这可能对您有用。

var dateStringsToValidate = "birthdatecake||birthdate||other||strings";
var toFind = "birthdate";

var splitDateStrings = dateStringsToValidate.Split(new[] {"||"}, StringSplitOptions.None);
var best = splitDateStrings
    .Where(s => s.Contains(toFind))
    .OrderBy(s => s.Length*1.0/toFind.Length) // a metric to define "best match"
    .FirstOrDefault();

Console.WriteLine(best);