请教(正则表达式)用 正则表达式可以做到 查找一个字符串在另外个字符串中出现的次数吗?

时间:2023-01-07 08:44:18
正则表达式只能查找比较第一个出现的字符串,返回true。。
怎么才能实现 然他继续查找呢比较?

我的思路是比较完一次后将原字符串中"cba"删除掉,然后执行第二次查找比较。。
有好点的方法实现我的思路吗(可以用charAt,比较烦)
希望大家提供点思路。谢谢!!!


我写的代码

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class comeoutNum {
public static int i = 0;

public static void printComeoutNum(String str){

String regEx = "cba"; //表示a或f 
Pattern p = Pattern.compile(regEx);
Matcher m=p.matcher(str);
if(m.find()){
 i ++;
}
System.out.println("cba出现的次数为:" + i); 

}
public static void main(String []args){
String A = new String("cbasdffdgasdcba");
printComeoutNum(A);
}

}





11 个解决方案

#1


cba出现的次数应该为2
上面我想加个颜色的,不知道显示了代码。。
重新贴个代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class comeoutNum {
public static int i = 0;

public static void printComeoutNum(String str){

String regEx = "cba"; //表示a或f 
Pattern p = Pattern.compile(regEx);
Matcher m=p.matcher(str);
if(m.find()){
 i ++;
}
System.out.println("cba出现的次数为:" + i); 

}
public static void main(String []args){
String A = new String("sdffdgasdcfdsba");
printComeoutNum(A);
}

}



#2


 public static void main(String []args){
        String A = new String(" cbasdffdgasdcfdsba cba");
        printComeoutNum(A);
    }

#3


想了一个比较怪异的方法:
String[] ss = s.split("cba",-1);
System.out.println(ss.length-1);
ss.length-1就是cba出现的次数。

#4


引用 3 楼 ltandfyy 的回复:
想了一个比较怪异的方法: 
String[] ss = s.split("cba",-1); 
System.out.println(ss.length-1); 
ss.length-1就是cba出现的次数。

厉害。。看了下JDK API。。String里居然有split这个好东西。。不错!!

#5


我这里的s就是LZ代码中的A,不过有个问题,"cba"这个字符串只能是普通字符串,不能是正则表达式的形式,否则我这段代码计算是错的。如果能保证,又图方便我觉得可以一试。

#6


引用 5 楼 ltandfyy 的回复:
我这里的s就是LZ代码中的A,不过有个问题,"cba"这个字符串只能是普通字符串,不能是正则表达式的形式,否则我这段代码计算是错的。如果能保证,又图方便我觉得可以一试。

JDK中String中的说明:
String[] split(String regex, int limit) 
          根据匹配给定的正则表达式来拆分此字符串。


可以是正则表达式形式啊。


 

#7


String regEx = "cba"; //表示a或f 
 * Pattern p = Pattern.compile(regEx);
Matcher m=p.matcher(str);
if(m.find()){
 i ++;
 str = replaceFirst(regEx,"A"); //不知道为什么出错。说没有定义的方法。这明明是String包里的。  
}
System.out.println("cba出现的次数为:" + i); 


开始的想法。。

#8


可以是正则表达式的形式没错,也正是因为这个,我这里恰恰不能用正则表达式的性质,一旦被正则介入就会得出错误的结果,并不是说程序会报错。
比如String A = "123";而你想知道"[0-9]"这样一个字符串在"123"中出现的次数,用我的方法就不行,你想得到的是0,结果为3。

#9


引用 8 楼 ltandfyy 的回复:
可以是正则表达式的形式没错,也正是因为这个,我这里恰恰不能用正则表达式的性质,一旦被正则介入就会得出错误的结果,并不是说程序会报错。 
比如String A = "123";而你想知道"[0-9]"这样一个字符串在"123"中出现的次数,用我的方法就不行,你想得到的是0,结果为3。

呵呵,我理解错了!你说的很对!
谢谢

#10


可能说法不精确,严格的来说是不能出现正则表达式的特殊符号,如果出现要转义成普通的字符,这样split才能达到你要的那种效果
把"[0-9]"这样的字符串要变成"\\[0\\-9\\]"又是正确的了,如果操作,LZ再想想,因为我觉得LZ有些基础问题不太清楚,别人光说没用,查下JDK API是正确的选择。

#11


晒下

public static void main(String[] args) {
String str= "qwertyuiopasdfghjklzxcvbnm1234567890";
// 以j打头的长度为2的字符!
String[] s=str.split("(j.{1})");
for(int i=0;i<s.length;i++){
// 出现次数为i
System.out.println(i);
}
}

#1


cba出现的次数应该为2
上面我想加个颜色的,不知道显示了代码。。
重新贴个代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class comeoutNum {
public static int i = 0;

public static void printComeoutNum(String str){

String regEx = "cba"; //表示a或f 
Pattern p = Pattern.compile(regEx);
Matcher m=p.matcher(str);
if(m.find()){
 i ++;
}
System.out.println("cba出现的次数为:" + i); 

}
public static void main(String []args){
String A = new String("sdffdgasdcfdsba");
printComeoutNum(A);
}

}



#2


 public static void main(String []args){
        String A = new String(" cbasdffdgasdcfdsba cba");
        printComeoutNum(A);
    }

#3


想了一个比较怪异的方法:
String[] ss = s.split("cba",-1);
System.out.println(ss.length-1);
ss.length-1就是cba出现的次数。

#4


引用 3 楼 ltandfyy 的回复:
想了一个比较怪异的方法: 
String[] ss = s.split("cba",-1); 
System.out.println(ss.length-1); 
ss.length-1就是cba出现的次数。

厉害。。看了下JDK API。。String里居然有split这个好东西。。不错!!

#5


我这里的s就是LZ代码中的A,不过有个问题,"cba"这个字符串只能是普通字符串,不能是正则表达式的形式,否则我这段代码计算是错的。如果能保证,又图方便我觉得可以一试。

#6


引用 5 楼 ltandfyy 的回复:
我这里的s就是LZ代码中的A,不过有个问题,"cba"这个字符串只能是普通字符串,不能是正则表达式的形式,否则我这段代码计算是错的。如果能保证,又图方便我觉得可以一试。

JDK中String中的说明:
String[] split(String regex, int limit) 
          根据匹配给定的正则表达式来拆分此字符串。


可以是正则表达式形式啊。


 

#7


String regEx = "cba"; //表示a或f 
 * Pattern p = Pattern.compile(regEx);
Matcher m=p.matcher(str);
if(m.find()){
 i ++;
 str = replaceFirst(regEx,"A"); //不知道为什么出错。说没有定义的方法。这明明是String包里的。  
}
System.out.println("cba出现的次数为:" + i); 


开始的想法。。

#8


可以是正则表达式的形式没错,也正是因为这个,我这里恰恰不能用正则表达式的性质,一旦被正则介入就会得出错误的结果,并不是说程序会报错。
比如String A = "123";而你想知道"[0-9]"这样一个字符串在"123"中出现的次数,用我的方法就不行,你想得到的是0,结果为3。

#9


引用 8 楼 ltandfyy 的回复:
可以是正则表达式的形式没错,也正是因为这个,我这里恰恰不能用正则表达式的性质,一旦被正则介入就会得出错误的结果,并不是说程序会报错。 
比如String A = "123";而你想知道"[0-9]"这样一个字符串在"123"中出现的次数,用我的方法就不行,你想得到的是0,结果为3。

呵呵,我理解错了!你说的很对!
谢谢

#10


可能说法不精确,严格的来说是不能出现正则表达式的特殊符号,如果出现要转义成普通的字符,这样split才能达到你要的那种效果
把"[0-9]"这样的字符串要变成"\\[0\\-9\\]"又是正确的了,如果操作,LZ再想想,因为我觉得LZ有些基础问题不太清楚,别人光说没用,查下JDK API是正确的选择。

#11


晒下

public static void main(String[] args) {
String str= "qwertyuiopasdfghjklzxcvbnm1234567890";
// 以j打头的长度为2的字符!
String[] s=str.split("(j.{1})");
for(int i=0;i<s.length;i++){
// 出现次数为i
System.out.println(i);
}
}