你好:)我必须找到给定文本中的所有单词,但有以下限制:
匹配应该不区分大小写。并非所有匹配的子字符串都是单词,应该计算在内。单词是由标点符号或文本的开头/结尾分隔的一系列字母。输出应该是一个整数。
我已经用StringComparison和for循环解决了它。
以下代码是我尝试使用REGEX(C#)进行的。 它只给出了模式字的计数,但它没有意识到这些限制。
您能否提供一些有关如何改进我的REGEX模式的提示?
string patternWord = Console.ReadLine();
string[] inputSentence = Console.ReadLine().Split();
int count = 0;
string pattern = @"(?:\b\w+\ \s|\S)*" + patternWord + @"(?:\b\w+\b\ \s|\S)?";
Regex rx = new Regex(pattern, RegexOptions.IgnoreCase);
for (int i = 0; i < inputSentence.Length; i++)
{
var mc = rx.Matches(inputSentence[i]);
foreach (Match m in mc)
{
count++;
}
}
Console.WriteLine("{0}", count);
编辑:
示例:
输入字 - 喜
输入句子 - 隐藏的网络只对日立设备说“嗨”。 嗨,马图说。 HI !
我只需要大胆的。
编辑2: 我也编辑了这些限制。
答案 0 :(得分:2)
一个简单的单词破坏正则表达式怎么样?
\bhi\b
在C#中,这将实现如下:
private static int WordCount(string word, string text)
{
var regex = new Regex(string.Format(@"\b{0}\b", word),
RegexOptions.IgnoreCase);
return regex.Matches(text).Count;
}
答案 1 :(得分:0)
很抱歉没有回答您的确切问题,但为什么要使用正则表达式? LINQ和Char类中的一些实用方法应该足够了:
using System.Linq;
public class Test
{
static void Main(string[] args)
{
string patternWord = Console.ReadLine();
string inputSentence = Console.ReadLine();
var words = GetWords(inputSentence);
var count = words.Count(word => string.Equals(patternWord, word, StringComparison.InvariantCultureIgnoreCase));
Console.WriteLine(count);
Console.ReadLine();
}
private static IEnumerable<string> GetWords(string sentence)
{
while (!string.IsNullOrEmpty(sentence))
{
var word = new string(sentence.TakeWhile(Char.IsLetterOrDigit).ToArray());
yield return word;
sentence = new string(sentence.Skip(word.Length).SkipWhile(c => !Char.IsLetterOrDigit(c)).ToArray());
}
}
}