匹配单词索引

时间:2016-07-08 12:42:47

标签: c# regex string split

我必须知道匹配发生在哪个单词。

我认为可以使用下面的代码,但是给我索引并且里面没有单词计数器。

是否可以在匹配发生的单词后找回信息?

const string stringToTest = "Am Rusch";
const string patternToMatch = @"\bRusch*";

Regex regex = new Regex(patternToMatch, RegexOptions.Compiled);

MatchCollection matches = regex.Matches(stringToTest);

foreach (Match match in matches)
{
    Console.WriteLine(match.Index);
}

字数应为1,因为匹配是在第二个字中找到的。

4 个答案:

答案 0 :(得分:1)

按空格分割string stringToTest,然后您可以轻松找到匹配发生的单词

答案 1 :(得分:1)

你可以玩一个小技巧来获取word索引,这是在获得所需字符串的索引之后,运行另一个正则表达式来获得它的单词索引。

const string stringToTest = "Am Rusch, you dare";
const string patternToMatch = @"\bRusch*";

Regex regex = new Regex(patternToMatch, RegexOptions.Compiled);

MatchCollection matches = regex.Matches(stringToTest);

foreach (Match match in matches)
{
    var wordIndex = Regex.Split(stringToTest.Substring(0, match.Index), "\\W").Count()-1;
    Console.WriteLine("Word Index: " + wordIndex);
}

这将返回字符串Word Index: 1

答案 2 :(得分:1)

正则表达式是一种模式匹配工具,其设计目的不是解释文本。

如果想要基本单词计数,请使用找到的正则表达式索引并将其传递给具有什么是单词的启发式方法;比如这个扩展名:

public static int AtWord(this string strBuffer, int index)
{ 
    int foundAt = -1;

    var splits = Regex.Split(strBuffer.Substring(0, index), @"(\s+)");

    if (splits.Any())
       foundAt = splits.Count() - 2;

    return foundAt;
}

用作

const string stringToTest = "Am Rusch Lunch";
const string patternToMatch = @"Rusch";

var match = Regex.Match(stringToTest, patternToMatch);

var wordIndex = stringToTest.AtWord(match.Index); // Returns 1, for a zero based list

答案 3 :(得分:1)

最快的方法是将字符串拆分为单词并找到与该模式匹配的单词的索引:

const string stringToTest = "Am Rusch";
const string patternToMatch = @"\bRusch*";
Console.WriteLine(Regex.Split(stringToTest,@"[^\w\p{M}]+")
        .Where(m => !string.IsNullOrEmpty(m))
        .ToList()
        .FindIndex(p => Regex.IsMatch(p,patternToMatch))
);
// Output: 1

请参阅IDEONE demo

说明

  • Regex.Split(stringToTest,@"[^\w\p{M}]+")将字符串拆分为单词,因为[^\w\p{M}]+匹配除字和变音符号之外的一个或多个符号
  • .Where(m => !string.IsNullOrEmpty(m))删除所有空元素
  • .FindIndex(p => Regex.IsMatch(p,patternToMatch))获取所需单词的索引。

matching alternative以便不删除空元素:

Regex.Matches(stringToTest,@"[\w\p{M}]+") // Match all words
        .Cast<Match>()                    // Cast to Matches array
        .Select(m => m.Value)             // Collect values only
        .ToList()                         // Convert to list
        .FindIndex(p => Regex.IsMatch(p, patternToMatch))