通配符匹配算法java实现

herochl 2010-03-30 08:09:08

/**
* 通配符算法。 可以匹配"*"和"?"
* 如a*b?d可以匹配aAAAbcd
* @param pattern 匹配表达式
* @param str 匹配的字符串
* @return
*/
public static boolean match(String pattern, String str) {
if (pattern == null || str == null)
return false;

boolean result = false;
char c; // 当前要匹配的字符串
boolean beforeStar = false; // 是否遇到通配符*
int back_i = 0;// 回溯,当遇到通配符时,匹配不成功则回溯
int back_j = 0;
int i, j;
for (i = 0, j = 0; i < str.length();) {
if (pattern.length() <= j) {
if (back_i != 0) {// 有通配符,但是匹配未成功,回溯
beforeStar = true;
i = back_i;
j = back_j;
back_i = 0;
back_j = 0;
continue;
}
break;
}

if ((c = pattern.charAt(j)) == '*') {
if (j == pattern.length() - 1) {// 通配符已经在末尾,返回true
result = true;
break;
}
beforeStar = true;
j++;
continue;
}

if (beforeStar) {
if (str.charAt(i) == c) {
beforeStar = false;
back_i = i + 1;
back_j = j;
j++;
}
} else {
if (c != '?' && c != str.charAt(i)) {
result = false;
if (back_i != 0) {// 有通配符,但是匹配未成功,回溯
beforeStar = true;
i = back_i;
j = back_j;
back_i = 0;
back_j = 0;
continue;
}
break;
}
j++;
}
i++;
}

if (i == str.length() && j == pattern.length())// 全部遍历完毕
result = true;
return result;
}



欢迎指正!
...全文
443 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
dobe1987 2010-03-31
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
kbyst 2010-03-31
  • 打赏
  • 举报
回复
学习学习
herochl 2010-03-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cooljia 的回复:]
Pattern p = Pattern.compile("a.*b?d");
Matcher m = p.matcher("aAAAbcd");
System.out.println(m.matches());


楼主看看jdk的这个,你为啥还要重复造轮子?
[/Quote]
还有 你这个正则也不对, 正则要写表达式.我只是 写一个方便效率高点的. 欢迎指出程序中的漏洞
herochl 2010-03-31
  • 打赏
  • 举报
回复
主要是效率问题考虑! 你可以运行个100W次 看看!正则可能不行
qingyuan18 2010-03-30
  • 打赏
  • 举报
回复
正则表达式?把JDK里的Pattern和Matcher封装一下即可,不用自己重新写了
cooljia 2010-03-30
  • 打赏
  • 举报
回复
Pattern p = Pattern.compile("a.*b?d");
Matcher m = p.matcher("aAAAbcd");
System.out.println(m.matches());


楼主看看jdk的这个,你为啥还要重复造轮子?
发布于:http://www.jesoft.cn/posts/list/5.page 1.5.1 —— 2006-01-22 修正细粒度分词错误的问题 1.5.0 —— 2007-01-18 全面支持Lucene 2.0 增强了词典维护的API 增加了商品编码的匹配 增加了Mail地址的匹配 实现了词尾消歧算法第二层的过滤 整理优化了词库 1.4.0 —— 2006-08-21 增加词典的动态扩展能力 1.3.3 —— 2006-07-23 修正无法多次增加词典的问题 1.3.2 —— 2006-07-03 修正细粒度分词错误的问题 1.3.1 —— 2006-06-23 修正在某些情况下分词遗漏的问题 1.3 —— 2006-06-22 实现了词尾消歧算法第一层的过滤 增加日期时间的匹配 1.2.2 —— 2006-06-13 完善了中英文噪声词典 1.2.1 —— 2006-06-10 修正中文数字成语无法识别的问题 1.2 —— 2006-06-08 增加中文数字的匹配(如:二零零六) 数量词采用“n”作为数字通配符 优化词典结构以便修改调整 1.1 —— 2006-06-06 增加扩展词典的静态读取方法 1.0.1 —— 2006-06-02 修正无法识别生僻字的问题 1.0 —— 2006-05-29 支持英文、数字、中文(简体)混合分词 常用的数量和人名的匹配 超过22万词的词库整理 实现正向最大匹配算法 支持分词粒度控制 //采用正向最大匹配的中文分词算法,相当于分词粒度等于0 MMAnalyzer analyzer = new MMAnalyzer(); //参数为分词粒度:当字数等于或超过该参数,且能成词,该词就被切分出来 MMAnalyzer analyzer = new MMAnalyzer(2); //字符串切分,常用于客户的关键字输入 analyzer.segment(text, separator); 词典维护API(静态方法): //增加一个新词典,采用每行一个词的读取方式(注意:多线程状态下此时的分词效果将不可预料) MMAnalyzer.addDictionary(reader); //增加一个新词 MMAnalyzer.addWord(newWord); //删除词库中的全部词语(注意:非常危险的操作,在没有加载新的词库前所有的分词都将失效) MMAnalyzer.clear(); //词库中是否包含该词 MMAnalyzer.contains(String word); //从词库中移除该词 MMAnalyzer.removeWord(String word); //当前词库中包含的词语总数 MMAnalyzer.size();

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧