写一个方法,有两个参数,第一个参数content 是一个字符串, 第二参数是一个array, 字符串数组,存放的是一些关键字,方法最后返回一个string.如果
content="I am a boy , they boys .";
arrStr={"boy", "boys", "female", "gender"}使用正则表达式,要返回content包含的关键字(就是arrStr里面出现的) 格式是 return "boy,boys";
如何实现?
content="I am a boy , they boys .";
arrStr={"boy", "boys", "female", "gender"}使用正则表达式,要返回content包含的关键字(就是arrStr里面出现的) 格式是 return "boy,boys";
如何实现?
因为content 有时候会很大,有几千个, array也有几十个,用Indexof会不会慢一些呢?
参考Lucene的实现原理吧简单的话就indexOf吧
使用哪种方法 速度会快一些呢?
因为content 有时候会很大,有几千个, array也有几十个,用Indexof会不会慢一些呢?
protected string Get_keyword()
{
string content="I am a boy , they boys .";
string[] arrStr={"boy", "boys", "female", "gender"};string s="";
for(int i=0;i<arrStr.Length;i++)
{
if(content.Contains(arrStr[i]))
s+=arrStr[i]+",";
}
return s;}
{
StringBuilder result = new StringBuilder();
StringBuilder sb = new StringBuilder("(?<!\\w)(");
foreach (string s in array)
{
sb.Append(s);
sb.Append("|");
} string reg = sb.ToString().TrimEnd('|') + ")(?!\\w)"; MatchCollection mc = Regex.Matches(content, reg, RegexOptions.IgnoreCase);
foreach (Match m in mc)
{
result.Append(m.Value);
result.Append(",");
} return result.ToString().TrimEnd(',');
}调用
string content = "I am a boy , they boys .";
string[] arrStr =new string[]{ "boy", "boys", "female", "gender" };
richTextBox2.Text = GetContainWords(content, arrStr);
效率上没有测,楼主可以试下
(?!\\w) 正向预搜索,表示后面不是字母
这样做是为了限制所要提取的是独立的单词其实下面这样更好一些,只是当时写的时候出了点小差错,所以用了上面的写法,而没有用下面的
private string GetContainWords(string content, string[] array)
{
StringBuilder result = new StringBuilder();
StringBuilder sb = new StringBuilder("\\b(");
foreach (string s in array)
{
sb.Append(s);
sb.Append("|");
} string reg = sb.ToString().TrimEnd('|') + ")\\b"; MatchCollection mc = Regex.Matches(content, reg, RegexOptions.IgnoreCase);
foreach (Match m in mc)
{
result.Append(m.Value);
result.Append(",");
} return result.ToString().TrimEnd(',');
}\b表示单词边界,也是为了限定提取部分为独立单词用的