怎样求一个字符串对某个正则表达式的最大匹配 两个字符串之间可以用动态规划求出编辑距离,进而求最大匹配项 一个字符串与一个正则表达式呢 跪求 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没怎么看懂楼主的问题呀!?Matcher m = Pattern.compile(正则式).matcher(字符串); int count = m.groupCount(); PS:一个字符串与一个正则表达式没有理解估计下面的会对LZ有帮助<BR>{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 <BR> <BR>{n,} n 是一个非负整数。至少匹配 n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 <BR> <BR>{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。<BR>“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次。 <BR> <BR>“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次。 <BR> <BR>“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。 出处:http://www.javaeye.com/topic/30728 import java.util.regex.Pattern;import java.util.regex.Matcher;public class Test{ public static void main(String[] args){ String str1 = "1gggg3abcd34"; String str2 = "abcdefggggdad"; String result = getMaxPattern(str1,str2); System.out.println("The max pattern string of :"); System.out.println(str1 + " and " + str2 + " is : "); System.out.println(result); } public static String getMaxPattern(String str1,String str2){ /** *这方法最好确认str1的长度要比str2的长度短。这样可以减少运行的时间。 */ String regex = "."; Pattern pattern = Pattern.compile(regex); Matcher matcher1 = pattern.matcher(str1); String result = ""; int indexPoint = 0 ; int realPoint = 0 ; String temp = ""; StringBuffer temp1 = new StringBuffer(); while(matcher1.find(indexPoint)){ temp = matcher1.group(); temp1.append(temp); if(str2.contains(temp1.toString())){ indexPoint ++; }else{ //这里出现了问题,会出现无限循环(已解决) //这里如果出现多个同样长度的同时匹配字符串的话将仅保留第一个, //可以通过修改代码保留全部(略) if(temp1.toString().length() - 1 > result.length()){ result = temp1.toString().substring(0,temp1.length() - 1);//修改这里 } realPoint = realPoint + temp1.toString().length(); temp1 = new StringBuffer(); indexPoint = realPoint; } } return result; }}这个应该可以满足你的要求 呵呵,今天去测了下我写的代码。发现了问题,比如 String str1 = "124567"; String str2 = "14567";时候就会出现问题。重新写了个,这个的话暂时没发现bugimport java.util.regex.Pattern;import java.util.regex.Matcher;import java.util.Scanner;public class GetMaxPattern{ public static void main(String[] args){ System.out.print("input the string(str1):"); Scanner scanner1 = new Scanner(System.in); String str1 = scanner1.nextLine(); System.out.print("input the other string(str2):"); Scanner scanner2 = new Scanner(System.in); String str2 = scanner2.nextLine(); System.out.println("str1: " + str1); System.out.println("str2: " + str2); String result = getMaxPattern(str1,str2); System.out.println("maxPattern: " + result); } public static String getMaxPattern(String str1,String str2){ String result = new String(); if(getGap(str1,str2) > 0){ String temp = str1; str1 = str2; str2 = temp; } /********************************************** 修改二 ***************************************************************/ //这里算是一个补丁 //2009-07-23 by ricky String regex1 = "[" + str1 + "]"; Matcher matcher1 = Pattern.compile(regex1).matcher(str2); if(matcher1.find()){ result = matcher1.group(); }else{ //假如单字符都没一个匹配的话可以直接退出程序了,不必进行剩下的操作了 return result; } /********************************************** 修改二结束***********************************************************/ String regex = "."; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str1); int patternPoint = 0; int realPoint = 0; String temp = null; while(matcher.find(realPoint)){ temp = str1.substring(patternPoint,++ realPoint); //通过修改了<第一修改处>其实程序还存在一个问题,就是这里得到的temp其实至少都是两个字符的String.substring(realPoint - 1, realPoint + 1) //这样就存在一种情况如 123456 与 dfdf2dafa //这样的话执行的结果将是无匹配 //所以必须添加以上的修改二,以达到判断单字符匹配问题. if(str2.indexOf(temp)>=0){ if(temp.length() > result.length()){ result = temp; } }else{ //第一修改处: //此步为关键步,不能用patternPoint = realPoint;,因为如果比较的两个数字式12345 24346的时候其执行将会是 // 1.比较1不可行 此时 realPoint 为 1 ,temp为 1,patternPoint 为 0 ,后通过else后patternPoint为 1 // 2.比较2时候可行 此时 realPoint 为 2 ,temp为 2 ,patternPoint 为 1 // 3.比较23时候不可行 此时 realPoint 为 3,temp 为23 ,patternPoint 为 1,后通过else后patternPoint 为 3 // 4.这里就出现了问题,因为temp再次获得的patternPoint将为3,此时将不包含数字3,唯有这里将其变为如下形式才可以解决. //同时也存在一种情况,比如有12 与 23456 的时候次方式需要重新修改 //2009-07-23 edit by ricky if(realPoint != 1){ patternPoint = realPoint - 1; }else{ patternPoint = realPoint; } } } return result; } private static int getGap(String str1,String str2){ return str1.length() - str2.length(); }} 今天去看了下之前发的第二个代码,发觉还是会有问题,所以重新弄了下。暂时没发现bug,虽然会挺浪费资源的,但是感觉能够做到的也就是这个了。注:在第二个修改的代码中如果是用 abc1111 与 abc2222bc1111就会出现问题了。之所以当时会说第一个版本不行,是因为考虑到出现了吞噬了前一个字符的现象,所以在第二个版本中每次失败都将游标向前移了一位。但是后来考虑到加入吞噬了两位或者两位以上呢?所以只能通过每次失败后都将patternPoint加一,然后将patternPoint赋值给realPointimport java.util.regex.Matcher;import java.util.regex.Pattern;public class Test{ public static void main(String[] args){ String str1 = "111122111"; String str2 = "2222222"; String result = getMaxPattern(str1,str2); System.out.println("result: " + result); } private static int getGaps(String str1,String str2){ return str1.length() - str2.length(); } public static String getMaxPattern(String str1,String str2){ String result = new String(); if(getGaps(str1,str2) > 0){ String temp = str1; str1 = str2; str2 = temp; } String temp = null; String regex = "."; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str1); int realPoint = 0; int patternPoint = 0; int i = 0 ; while(matcher.find(realPoint)){ temp = str1.substring(patternPoint, ++ realPoint); if(str2.contains(temp)){ if(temp.length() > result.length()){ result = temp; } }else{ patternPoint ++; realPoint = patternPoint; } } return result; }} 在线等,数据优化思路 理解——思想! 如何 把字符串Fri Jul 03 10:48:32 CST 2009转换日期形式的字符串? 反射问题 小弟刚学JAVA,请问下JTEXTAREA文本区 有没有让文本向右对齐的方法? 如何在TextArea中按向上箭头,而光标不往上一行移动? java 键盘输入 请教,一个udp或者tcp的套接字可以在多个线程里面同时往外发送消息吗!!!!! 这个问题??? 我要学java,有了JDK,是不是还需要一个集成开发环境,如Jbuilder??? 呼叫bigbug9002 大哥,,请进入 java代码的运行效率高低的判断标准都有哪些???
int count = m.groupCount();
没有理解
估计下面的会对LZ有帮助<BR>{n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
<BR>
<BR>{n,} n 是一个非负整数。至少匹配 n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。
<BR>
<BR>{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。<BR>“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次。
<BR>
<BR>“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次。
<BR>
<BR>“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
出处:http://www.javaeye.com/topic/30728
import java.util.regex.Pattern;
import java.util.regex.Matcher;public class Test{
public static void main(String[] args){
String str1 = "1gggg3abcd34";
String str2 = "abcdefggggdad"; String result = getMaxPattern(str1,str2);
System.out.println("The max pattern string of :");
System.out.println(str1 + " and " + str2 + " is : ");
System.out.println(result);
} public static String getMaxPattern(String str1,String str2){
/**
*这方法最好确认str1的长度要比str2的长度短。这样可以减少运行的时间。
*/
String regex = ".";
Pattern pattern = Pattern.compile(regex);
Matcher matcher1 = pattern.matcher(str1);
String result = "";
int indexPoint = 0 ;
int realPoint = 0 ;
String temp = "";
StringBuffer temp1 = new StringBuffer();
while(matcher1.find(indexPoint)){
temp = matcher1.group();
temp1.append(temp);
if(str2.contains(temp1.toString())){
indexPoint ++;
}else{
//这里出现了问题,会出现无限循环(已解决)
//这里如果出现多个同样长度的同时匹配字符串的话将仅保留第一个,
//可以通过修改代码保留全部(略)
if(temp1.toString().length() - 1 > result.length()){
result = temp1.toString().substring(0,temp1.length() - 1);//修改这里
}
realPoint = realPoint + temp1.toString().length();
temp1 = new StringBuffer();
indexPoint = realPoint;
}
}
return result;
}
}这个应该可以满足你的要求
String str1 = "124567";
String str2 = "14567";
时候就会出现问题。
重新写了个,这个的话暂时没发现bugimport java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.Scanner;public class GetMaxPattern{
public static void main(String[] args){
System.out.print("input the string(str1):");
Scanner scanner1 = new Scanner(System.in);
String str1 = scanner1.nextLine(); System.out.print("input the other string(str2):");
Scanner scanner2 = new Scanner(System.in);
String str2 = scanner2.nextLine(); System.out.println("str1: " + str1);
System.out.println("str2: " + str2);
String result = getMaxPattern(str1,str2);
System.out.println("maxPattern: " + result);
} public static String getMaxPattern(String str1,String str2){
String result = new String();
if(getGap(str1,str2) > 0){
String temp = str1;
str1 = str2;
str2 = temp;
} /********************************************** 修改二 ***************************************************************/
//这里算是一个补丁
//2009-07-23 by ricky
String regex1 = "[" + str1 + "]";
Matcher matcher1 = Pattern.compile(regex1).matcher(str2);
if(matcher1.find()){
result = matcher1.group();
}else{
//假如单字符都没一个匹配的话可以直接退出程序了,不必进行剩下的操作了
return result;
}
/********************************************** 修改二结束***********************************************************/ String regex = ".";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str1); int patternPoint = 0;
int realPoint = 0; String temp = null;
while(matcher.find(realPoint)){
temp = str1.substring(patternPoint,++ realPoint);
//通过修改了<第一修改处>其实程序还存在一个问题,就是这里得到的temp其实至少都是两个字符的String.substring(realPoint - 1, realPoint + 1)
//这样就存在一种情况如 123456 与 dfdf2dafa
//这样的话执行的结果将是无匹配
//所以必须添加以上的修改二,以达到判断单字符匹配问题. if(str2.indexOf(temp)>=0){
if(temp.length() > result.length()){
result = temp;
}
}else{
//第一修改处:
//此步为关键步,不能用patternPoint = realPoint;,因为如果比较的两个数字式12345 24346的时候其执行将会是
// 1.比较1不可行 此时 realPoint 为 1 ,temp为 1,patternPoint 为 0 ,后通过else后patternPoint为 1
// 2.比较2时候可行 此时 realPoint 为 2 ,temp为 2 ,patternPoint 为 1
// 3.比较23时候不可行 此时 realPoint 为 3,temp 为23 ,patternPoint 为 1,后通过else后patternPoint 为 3
// 4.这里就出现了问题,因为temp再次获得的patternPoint将为3,此时将不包含数字3,唯有这里将其变为如下形式才可以解决.
//同时也存在一种情况,比如有12 与 23456 的时候次方式需要重新修改
//2009-07-23 edit by ricky
if(realPoint != 1){
patternPoint = realPoint - 1;
}else{
patternPoint = realPoint;
}
}
}
return result;
} private static int getGap(String str1,String str2){
return str1.length() - str2.length();
}
}
注:在第二个修改的代码中如果是用 abc1111 与 abc2222bc1111就会出现问题了。
之所以当时会说第一个版本不行,是因为考虑到出现了吞噬了前一个字符的现象,所以在第二个版本中每次失败都将游标向前移了一位。但是后来考虑到加入吞噬了两位或者两位以上呢?所以只能通过每次失败后都将patternPoint加一,然后将patternPoint赋值给realPoint
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Test{
public static void main(String[] args){
String str1 = "111122111";
String str2 = "2222222";
String result = getMaxPattern(str1,str2);
System.out.println("result: " + result);
}
private static int getGaps(String str1,String str2){
return str1.length() - str2.length();
} public static String getMaxPattern(String str1,String str2){
String result = new String();
if(getGaps(str1,str2) > 0){
String temp = str1;
str1 = str2;
str2 = temp;
} String temp = null;
String regex = ".";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str1); int realPoint = 0;
int patternPoint = 0; int i = 0 ;
while(matcher.find(realPoint)){
temp = str1.substring(patternPoint, ++ realPoint);
if(str2.contains(temp)){
if(temp.length() > result.length()){
result = temp;
}
}else{
patternPoint ++;
realPoint = patternPoint;
}
} return result;
}}