求助,关于正则表达式

时间:2008-05-10 21:48:31   来源:论坛整理  作者:  编辑:chinaitzhe
将 111.22.12.33 改成111.022.012.033 即不足3位的前面补0
在java中写成这样:
replaceAll("\\.(\\d\\d)\\.","\\.0\\1\\.");

就是从 "."开始起如有连续两个数字后面再跟一个 "." ,然后替换成 \.\1\.的形式。
但是\1 这个有问题,无法捕捉前面的(\d\d),写成\1,\\1,\\\1,\\\\1 都不行。
请问该如何写,才能 捕捉前面的 (\d\d) 呢?
网友回复:我这样的写结果变成了 xxx.01.xxx 这种形式(xxx表示数字)
网友回复:正则估计不行,你的分界 [.] 会被重用的。

参考这个看看

Java code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



  public static void main(String[] args) {

    String str = "111.22.22.33.44.55.66.12.33";

    String[] parts = str.split("\\.");

    Object[] ids = new Integer[parts.length];

    int i = 0;

    StringBuilder b = new StringBuilder();

    for (String s : parts) {

      if (s.length() <= 0) {

        continue;

      }

      ids[i  ] = new Integer(s);

      b.append("d,");

    }

    b.deleteCharAt(b.length() - 1);



    System.out.println(String.format(b.toString(), ids));

  }


网友回复:楼上正解。
网友回复:用正则貌似确实比较麻烦,写个方法转下吧
Java code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





/**

*格式转换

*/

public static String ParseStr(String str){

        String[] StrList = str.split("\\.");

        StringBuffer newStr = new StringBuffer();

        for(String strSplit : StrList){

            int splitLength = strSplit.length();

            if(splitLength == 3){

                newStr.append(strSplit);

            }

            if(splitLength == 2){

                newStr.append("0"   strSplit);

            }

            if(splitLength == 1){

                newStr.append("00"   strSplit);

            }

        }

        return newStr.toString();

    }




网友回复:不好意思,上面的忘了把"."加进去了
Java code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





public class IpParse {

    public static String ParseStr(String str){

        String[] StrList = str.split("\\.");

        StringBuffer newStr = new StringBuffer();

        for(String strSplit : StrList){

            int splitLength = strSplit.length();

            if(splitLength == 3){

                newStr.append(strSplit   ".");

            }

            if(splitLength == 2){

                newStr.append("0"   strSplit   ".");

            }

            if(splitLength == 1){

                newStr.append("00"   strSplit   ".");

            }

        }

        String returnStr = newStr.toString().substring(0, newStr.length()-1);

        return returnStr;

    }

    

    public static void main(String[] args){

        System.out.println(IpParse.ParseStr("21.2.222.03.56"));

    }



}

打印结果:021.002.222.003.056




网友回复:
我也湊热闹


Java code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/





String[] StrList = str.split("\\.");

                DecimalFormat f = new DecimalFormat("000");

                StringBuffer newStr = new StringBuffer();

                for(String strSplit : StrList){

                    newStr.append(f.format(Integer.parseInt(strSplit)) ".");

                }

                String returnStr = newStr.toString().substring(0, newStr.length()-1);

               System.out.println(returnStr);




网友回复:
引用楼主 michael9527 的帖子:
将 111.22.12.33 改成111.022.012.033 即不足3位的前面补0
在java中写成这样:
replaceAll("\\.(\\d\\d)\\.","\\.0\\1\\.");

就是从 "."开始起如有连续两个数字后面再跟一个 "." ,然后替换成 \.\1\.的形式。
但是\1 这个有问题,无法捕捉前面的(\d\d),写成\1,\\1,\\\1,\\\\1 都不行。
请问该如何写,才能 捕捉前面的 (\d\d) 呢?

答:可以用正则啊
String s="12.3.44.55";
String rs=s.replaceAll("((? <=^ ¦\\.)\\d{2}(?=\\. ¦$))", "0$1");
String rs1=rs.replaceAll("((? <=^ ¦\\.)\\d(?=\\. ¦$))", "00$1");
System.out.print(rs1);
运行结果是:
012.003.044.055
网友回复:mark
网友回复:
Java code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



public class Test {



    public static void main(String[] args) throws IOException {

        String str = "adsfa 1.16.12.1 asdfasdf 10.14.125.1 asdf 192.16.10.5";

        String regex = "\\b(?=\\d\\d?\\b)";

        str = str.replaceAll(regex, "0").replaceAll(regex, "0");

        System.out.println(str);

    }

}



不想替换两次的话,可以手工进行替换处理:

Java code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



import java.util.regex.Matcher;

import java.util.regex.Pattern;



public class Test {



    public static void main(String[] args) throws IOException {

        String str = "adsfa 1.16.12.1 asdfasdf 10.14.125.1 asdf 192.16.10.5";

        String regex = "\\b(\\d\\d?)\\b";

        Pattern p = Pattern.compile(regex);

        Matcher matcher = p.matcher(str);

        StringBuffer sb = new StringBuffer();

        while(matcher.find()) {

            String r = matcher.group(1);

            if(r.length() == 2) {

                matcher.appendReplacement(sb, "0"   r);

            }else{

                matcher.appendReplacement(sb, "00"   r);

            }

        }

        matcher.appendTail(sb);

        str = sb.toString();

        System.out.println(str);

    }

}



由于正则表达式在作替换时并不会把已经替换的字符代回原字符串中再次与表达式进
行匹配的,因此也就不能使用一个表达式做一次替换。

第二种方式虽然只是做了一次替换操作,但由于涉及一些逻辑判定,在字符串较少的
情况下效率明显地低于第一种方式。假如字符串的长度比较大,那第二种的效率是高
于第一种的。

假如需要格式化的仅仅是一个 IP 地址的字符串(即字符串中只有 IP 地址),那可
以采用第一种方式,或者不采用正则表达式的方式。
关键字:求助,正则,表达式,

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面