求 JAVA 字符串匹配 完美算法

只需要实例化 类Matching  设置参数 并调用m.getIndex()方法就OK    请测试...

 

public class Test18{
 
 public static void main(String[] args){
  Matching m = new Matching();
  m.setOrgStr("ALSKLSHFKDLLS");
  m.setSubStr("LS");
  System.out.println(m.getIndex());
  
 }
}
class Matching{
 
 String orgStr ="";
 String subStr ="";
 
 public void setOrgStr(String orgStr){
  this.orgStr = orgStr;
 }
 
 public void setSubStr(String subStr){
  this.subStr = subStr;
 }
   
 public String getIndex(){
  
  StringBuffer sb = new StringBuffer("{");
  
  //根据关键字subStr来拆分字符串orgStr所得的字符串数组
  String[] sub = orgStr.split(subStr);    
  
  int keyLength = subStr.length();    //关键字长度
  int keySize = 0;    //关键字个数
  
  int subSize = sub.length;    //子字符串个数
  int subLength = 0;    //子字符串长度
    
  if(!orgStr.endsWith(subStr)){
   keySize = subSize-1;
  }else
   keySize = subSize;

  int[] index = new int[keySize];//关键字下标数组
  for(int i=0;i<keySize;i++){
   subLength = sub[i].length();
   if(i==0){
    index[i]=subLength; 
   }else
    index[i]=index[i-1]+subLength+keyLength;   
  }
  
  if(keySize>0){
   int l = keySize-1;
   for(int i=0;i<l;i++){
    sb.append(index[i]+",");
   }
   sb.append(index[l]);//最后一个关键字下标
  }else{
   sb.append("NULL"); 
  }
  sb.append("}");
  
  return  sb.toString();
 }
 
}

追问:

能实现这个目的,谢谢了。

那么,问题继续:上面是将字符串匹配取出标志位,下面一个问题将用到标志位。

场景:原始字符串为:LKSJDI(LKJSD)LSIDJ(KIKS)LSK(LKDL)LKDSJ,现在我仅知道里面有括号并且知道括号内有一已知字符串KJS,括号的对数不清楚,我怎么去根据KJS去取出LKJSD(即括号内的内容)并且将其内容替换为另一个字符串NEWSTRING,即替换后的字符串为:LKSJDI(NEWSTRING)LSIDJ(KIKS)LSK(LKDL)LKDSJ

回答:

方法有很多种,我这是其一,比较简单,没有用到超纲知识。

我想你是一名java初学者吧。建议你多看API

java.lang.String 里的方法很多 足够你用的

 

测试结果截图:

 


public class Test19{
 
 public static void main(String[] args){
  Matching m = new Matching();
  
  System.out.println("问题①: 在orgStr中搜寻subStr所在的位置的下标数组 \n"
  +"如:在orgStr[ALSKLSHF KDLLS]中搜寻subStr[LS],返回{1,4,11} \n");
  System.out.println("...\n");
  System.out.println("测试结果:");
  
  String s1 = "ALSKLSHFKDLLS";
  String s2 = "LS";
  String s3 = null; 
  m.setOrgStr(s1);
  m.setSubStr(s2);
  System.out.println("原始字符串: "+s1);
  System.out.println("索引字符串: "+s2);
  System.out.println("索引坐标: "+m.getIndexOfString());
  System.out.println("----------------------------------------------------");
   System.out.println("问题②: 原始字符串为:LKSJDI(LKJSD)LSIDJ(KIKS)LSK(LKDL)LKDSJ,\n"
   +"现在我仅知道里面有括号并且知道括号内有一已知字符串KJS,\n"
   +"括号的对数不清楚,我怎么去根据KJS去取出LKJSD(即括号内的内容)\n"
   +"并且将其内容替换为另一个字符串NEWSTRING,即替换后的字符串为:\n"
   +"LKSJDI(NEWSTRING)LSIDJ(KIKS)LSK(LKDL)LKDSJ \n");
  
  System.out.println("...\n");
  System.out.println("测试结果:");
   
  s1 = "LKSJDI(LKJSD)LSIDJ(KIKS)LSK(LKDL)LKDSJ";
  s2 = "("; 
  m.setOrgStr(s1);
  m.setSubStr(s2);
  System.out.println("原始字符串: "+s1);
  System.out.println("索引字符串: "+s2);
  int[] a = m.getIndexOfIntArray ();
  System.out.println("索引坐标: "+m.getIndexOfString());
  s2 = ")";
  m.setSubStr(s2);
  System.out.println("索引字符串: "+s2);
  int[] b = m.getIndexOfIntArray ();
  System.out.println("索引坐标: "+m.getIndexOfString());
  String[] sub = m.getSubString(a,b);
  System.out.println("包含()"+"的字符串数组:");
  for(int i=0;i<sub.length;i++){
   System.out.println("\t\t"+sub[i]);
  }
  s2 = "KJS";
  m.setSubStr(s2);
  System.out.println("索引字符串: "+s2);
  String[] s = m.getSubString(sub);
  System.out.println("包含"+s2+"的字符串数组:");
  for(int i=0;i<s.length;i++){
   System.out.println("\t\t"+s[i]);
  }
  s2 = "NEWSTRING";
  System.out.println("替换字符串: "+s2);
  m.setSubStr(s2);
  System.out.println("替换后新的字符串:"+m.getStringOfReplaced(s));
  System.out.println("----------------------------------------------------");
 }
}
class Matching{
 
 String orgStr ="";
 String subStr ="";
 
 public void setOrgStr(String orgStr){
  this.orgStr = orgStr;
 }
 
 public void setSubStr(String subStr){
  //处理部分转义字符...
  if(subStr.equals ("(")||subStr.equals (")")
   ||subStr.equals (".")||subStr.equals ("|")){
   subStr="\\"+subStr;
  }
  this.subStr = subStr;
 }
 //方法 public String replaceAll(String oldStr, String newStr)  为字符串替换
 //这里的 newStr为subStr
 public String getStringOfReplaced(String[] oldStr){
  String s = null;
  if(oldStr!=null){
   int size = oldStr.length;
   for(int i=0;i<size;i++){
    
    //根据KJS去取出LKJSD(即括号内的内容)并且将其内容替换为另一个字符串NEWSTRING
    //因为是替换目标括号里的内容 并不包括括号  
    //所以要把括号先去掉  --截取子字符串
    String old = oldStr[i].substring (1,oldStr[i].length ()-1);
    s = orgStr.replace (old,subStr);
   }
  }
  return s;
 }
 
 public String[] getSubString(String[] sub){
  String[] s=null;
  int lg = 0;  //字符串数组S的长度
  if(sub!=null){
   int size = sub.length;   
   for(int i=0;i<size;i++){ 
   //sub[i]包含子字符串subStr  即括号内是否包含有 KJS 
    if(sub[i].contains (subStr)){
     lg++;
    }
   }
 //  System.out.println("包含KJS的子字符串个数:"+lg);
   if(lg>0){//存在 KJS
    s = new String[lg];
    for(int i=0;i<lg;i++){
     int j = 0;
     //循环遍历 若存在 subStr:KJS 终止当前循环 赋值  再接着循环...     
     while(sub[j].contains (subStr)){
      s[i] = sub[j];
      j++;
     }
    }     
   }  
  }  
  return s;
 }
 
 //获取子字符串  --a:开始位置  b:结束位置
 public String[] getSubString(int[] a,int[] b){
  String[] sub=null;
  if(a!=null&&b!=null){
   int size = a.length;
   if(b.length==size){
    sub = new String[size];
    for(int i=0;i<size;i++){
     //String.substring(int a,int b)  不包括b  所以要加1
     sub[i] = orgStr.substring (a[i],b[i]+1);
    }
   }
  }
  
  return sub;
 }
 
 
 //获取索引下标  --整形数组
 public int[] getIndexOfIntArray(){
  
  //根据关键字subStr来拆分字符串orgStr所得的字符串数组
  String[] sub = orgStr.split(subStr);   

  int keyLength = subStr.length();    //关键字长度
  if(subStr.contains ("\\"))//转义字符  多加了个'\' 所以长度要减1
   keyLength--; 
  
  int keySize = 0;    //关键字个数
  
  int subSize = sub.length;    //子字符串个数
  int subLength = 0;    //子字符串长度
    
  if(!orgStr.endsWith(subStr))
   keySize = subSize-1;
  else
   keySize = subSize;

  int[] index = new int[keySize];//关键字下标数组
  for(int i=0;i<keySize;i++){
   subLength = sub[i].length();
   if(i==0){
    index[i]=subLength; 
   }else
    index[i]=index[i-1]+subLength+keyLength;   
  }
  return  index;
  
 }
 
 //获取索引下标 --字符串 
 public String getIndexOfString(){
  
  StringBuffer sb = new StringBuffer("{");
  int[] index = getIndexOfIntArray();
  int keySize = index.length;
  if(keySize>0){
   int l = keySize-1;
   for(int i=0;i<l;i++){
    sb.append(index[i]+",");
   }
   sb.append(index[l]);//最后一个关键字下标
  }else{
   sb.append("NULL"); 
  }
  sb.append("}");
  
  return  sb.toString();
 }
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值