我正在使用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;工作。
如果有人可以帮助我,那就太棒了。 谢谢,
答案 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)