获取文本实例的数量" x"在单词列表中

时间:2016-07-13 14:03:55

标签: c# regex list instance

我正在使用c#查找" x"的确切单词的实例数。例如:

List<string> words = new List<string>  {"Mode", "Model", "Model:", "Generator (1100)", "(1100)", "13Generator"}; 
Text = "This is Model: x Type: Model: y aa: Mode e Model: Generator (1100) (1100) 13Generator";
var textArray = Text.Split(' ');
var count = words.Select(item => textArray.ToList().Contains(item) ? 
             textArray.Count(d => d == item) : 0).ToArray();

我使用了Regex:

List<int> count = new List<int>();
foreach (var word in words)
{
    var regex = new Regex(string.Format(@"\b{0}(\s|$)", word), RegexOptions.IgnoreCase);
    count.Add(regex.Matches(Text).Count);
}

我希望伯爵是: {1,0,3,1,2,1) 在我的情况下,我不想使用拆分。那么,有什么办法可以不使用split?

{&#34; Mode&#34;,&#34; Model&#34;,&#34; Model:&#34; };是完美的工作,但发电机(1100),(1100)不工作。我想要所有&#34; Mode&#34;,&#34; Model:&#34;,&#34; Generator(1100)&#34;,&#34;(1100)&#34;,和& #34; 13Generator&#34;工作。

如果有人可以帮助我,那就太棒了。 谢谢,

3 个答案:

答案 0 :(得分:1)

查看输入数据,您需要能够将字符串作为整个单词进行匹配,而不管words项中第一个和最后一个字符的类型。

我建议使用明确的单词边界(?<!\S)(?!\S)

var words = new List<string> { "Mode", "Model", "Model:", "Generator (1100)", "(1100)", "13Generator" };
var count = new List<int>();
var Text = "This is Model: x Type: Model: y aa: Mode e Model: Generator (1100) (1100) 13Generator";
foreach (var word in words)
{
    var reg = string.Format(@"(?<!\S){0}(?!\S)", Regex.Escape(word));
    // Or, in C#6.0
    // var reg = $@"(?<!\S){Regex.Escape(word)}(?!\S)";
    count.Add(Regex.Matches(Text, reg, RegexOptions.IgnoreCase).Count);
}
Console.WriteLine(string.Join(", ", count));
count.Add(Regex.Matches(Text, reg, RegexOptions.IgnoreCase).Count);
// => 1, 0, 3, 1, 2, 1

请参阅IDEONE demo

(?<!\S)(?!\S)外观确保单词既不在前面也不在后面跟着非空白字符。

将括号(等等)作为文字符号进行匹配,需要转义特殊字符。

答案 1 :(得分:0)

某些目标序列包含特殊的正则表达式字符。例如,

中的括号
Generator (1100)

将被解释为捕获组的分隔符,而不是字面括号。这些字符需要正确转义。正则表达式库为此提供了Escape方法:

// This uses C# 6 interpolated strings instead of string.Format:
var regex = new Regex(@$"\b{Regex.Escape(word)}(\s|$)"), RegexOptions.IgnoreCase);

单词转义后,您可以继续搜索原始字符串而不进行拆分。

答案 2 :(得分:0)

这应该有用。

    words.Select(w => 
                 new { 
                      Word = w, 
                      Count = Regex.Matches(text, @"\b" + w.Replace(" ",@".+\s+.") + @"\b").Count 
                     })
         .Where(o => o.Count > 0).ToList()
         .ForEach(o => Console.WriteLine(string.Format("{0} ===> {1} occurence(s)", o.Word, o.Count)));

输出:

Mode ===> 1 occurence(s)
Model ===> 3 occurence(s)
Generator (1100) ===> 1 occurence(s)
(1100) ===> 2 occurence(s)
13Generator ===> 1 occurence(s)