只需要实例化 类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();
}
}