liuchen1206
今天参加了腾讯的现场招聘会,碰到这个一个题目:
在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(*、?),通配符*表示零个或多个任意字母,通配符?表示一个任意字母。
如:J* Smi?? 可以匹配John Smith .
今天参加了腾讯的现场招聘会,碰到这个一个题目:
在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(*、?),通配符*表示零个或多个任意字母,通配符?表示一个任意字母。
如:J* Smi?? 可以匹配John Smith .
请用C语言实现如下函数:
void scan(const char* pszText, const char* pszName);
注:pszText为整个文章字符,pszName为要求匹配的英文名。
请完成些函数实现输出所有匹配的英文名,除了printf外,不能用第三方的库函数等。
上面这个题目是摘自http://blog.csdn.net/v_JULY_v的微软面试61题,虽然人家要求用c语言,咱也用Java做一下,虽然人家要求不能用第三方的库函数,咱也先用下java.util.regex.Pattern和java.util.Matcher。汗颜的是如果不是在Myeclipse环境下开发,断然不知道这两个类的包目录,如果不是百度了一下,把Java里的模式匹配都忘干净了。
package beauty;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class M61 {
public void scan(String text,String name)
{
name = name.replaceAll("[?]","[a-zA-Z]");//?表示任意一个字母
name = name.replaceAll("[*]", "[a-zA-Z]*");//*表示0个或多个字母
name =name+" ?";//小心空格问题,使pattern以0个或一个空格结束
Pattern pattern = Pattern.compile(name);
Matcher match = pattern.matcher(text);
while(match.find())
{
System.out.println(match.group());
}
}
public static void main(String[] args)
{
M61 m61 = new M61();
m61.scan("Jeck Smith,Jhoin Smith Jek Smidd", "J* Smi??");
System.out.println();
}
}
可以看出要用Java的Pattern和Matcher,还是要严格小心的。尤其在replace的时候,"[*]"而不能写"*",否则编译就Error了。至于不考虑用Java的Pattern和Matcher的方法呢,还没想出来呢。