两个字符串之间可以用动态规划求出编辑距离,进而求最大匹配项 一个字符串与一个正则表达式呢 跪求

解决方案 »

  1.   

    没怎么看懂楼主的问题呀!?Matcher m = Pattern.compile(正则式).matcher(字符串); 
    int count = m.groupCount();
      

  2.   

    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
      

  3.   


    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;
    }
    }这个应该可以满足你的要求
      

  4.   

    呵呵,今天去测了下我写的代码。发现了问题,比如 
             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();
    }
    }
      

  5.   

    今天去看了下之前发的第二个代码,发觉还是会有问题,所以重新弄了下。暂时没发现bug,虽然会挺浪费资源的,但是感觉能够做到的也就是这个了。
    注:在第二个修改的代码中如果是用 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;
    }}