经过1通宵的思考与实验终于在2006/5/17日中午12:00点把 * ? 通配的问题解决了。
先谈谈?号(问号的处理比较简单)
用for 循环进行逐一比较就可以了。
*号的处理,就比较复杂了。在这里,我采用的是 左迭归思想进行匹配。由于鄙人文学较差,不好对代码进行解释。就请大家自行看看代码里的注释吧。(虽然少,不过关键地方都写了)
public class myString {
String str=null;
myString(String value){str=value;}
public boolean isLike(String regex)
{
if(regex.indexOf("?")!=-1)return WenHao(regex);
else if(regex.indexOf("*")!=-1)return XingHao(str,regex);
return false;
}
private boolean WenHao(String regex)
{
// ?号匹配
if(str.length()!=regex.length())return false;
for(int i=0;i<regex.length();i++)
if(str.charAt(i)!=regex.charAt(i) && regex.charAt(i)!='?')
return false;
return true;
}
private boolean XingHao(String Str,String regex)
{
// *号匹配
int Lstr=Str.length();
int Lreg=regex.length();
int x1=regex.indexOf("*");
switch(x1)
{
case -1:{
//x1=-1 regex 中没有 * 号,不需要跌归计算
if(Lstr==Lreg)
{
if(Lstr==0)return true;
for(int kk=0;kk<Lreg;kk++)//检测字符串是否匹配
if(Str.charAt(kk)!=regex.charAt(kk))return false;
return true;
}else
return false;
}
case 0:
{//x1=0 regex 中 * 号在首位
if(Lreg==1)return true;//只有一个星号,自然是匹配的,如 regex="*"
boolean right=false;
int p=0;
// *号在首位,定位 * 号 后一位
for(int k=0;k<Lstr;k++)
if(Str.charAt(k)==regex.charAt(x1+1)||regex.charAt(x1+1)=='*')
{p=k;right=true;break;}//遇到 ** 就直接 right=true;
if(right==false)return false;
else
{
if(p==Lstr)return true;
return XingHao(Str.substring(p,Lstr),regex.substring(x1+1,Lreg));
}
}
default:
{ //x1>0
for(int i=0;i<x1;i++)
if(Str.charAt(i)!=regex.charAt(i))return false;
return XingHao(Str.substring(x1,Lstr),regex.substring(x1,Lreg));
}
}
}
public static void main(String[] args) {
System.out.println("str=ABCD regex=ABC? :"+new myString("ABCD").isLike("ABC?"));
System.out.println("str=ABCD regex=A??? :"+new myString("ABCD").isLike("A???"));
System.out.println("str=ABCD regex=A?? :"+new myString("ABCD").isLike("A??"));
System.out.println("str=ABCD regex=?BC? :"+new myString("ABCD").isLike("?BC?"));
System.out.println("str=ABCD regex=*B*D :"+new myString("ABCD").isLike("*B*D"));
System.out.println("str=ABCD regex=*BCD :"+new myString("ABCD").isLike("*BCD"));
System.out.println("str=ABCD regex=*A*B*D :"+new myString("ABcCD").isLike("*A*B*D"));
}
}
分享到:
相关推荐
java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java 字符串转16进制 16进制转字符串 将两个ASCII字符合成一个字节; java ...
89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符串方法.zip89.java字符...
java字符串处理取出括号内的字符串 都是我自己试过可以用的j
Java实现字符串的匹配.doc
java 字符串 详细实例代码 字符串检索 可改变字符串 字符串生成器 日期和时间字符串格式化
C#中文文本匹配,字符串匹配,中文词语匹配,计算2个句子相似度 中文匹配C#中文文本匹配,字符串匹配,中文词语匹配,计算2个句子相似度 C#中文文本匹配,字符串匹配,中文词语匹配,计算多个句子相似度 C#中文文本...
java压缩字符串
JAVA的字符串拼接与性能 概述:本文主要研究的是JAVA的字符串拼接的性能,原文中的测试代码在功能上并不等价,导致concat的测试意义不大。不过原作者在评论栏给了新的concat结果,如果有兴趣的同学建议自己修改代码...
java 字符串的加密 java 字符串的加密 java 字符串的加密
java 分解字符串 java 分解字符串 java 分解字符串
java字符串的处理,java中常用字符串方法总结,java中常用字符串方法总结,
有关java里的一些字符串的总结,适合java初学者学习。
JAVA 字符串 操作
Java字符串长度不够前面或后面补0
java中求字符串表达式的值看起来很伤脑筋,但如果你用BeanShell,一切都变得很简单。
java字符串的各种编码转换. java字符串的各种编码转换
3.Build a program using Java array of string, you need to input 5 or more most famous universities in the world, and the annual tuition of each university. Please (1) Display the university name by ...
Java分割字符串
96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip96.java字符串反转案例.zip...
29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29.java字符串+操作.zip29...