将 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) 呢?
在java中写成这样:
replaceAll("\\.(\\d\\d)\\.","\\.0\\1\\.");就是从 "."开始起如有连续两个数字后面再跟一个 "." ,然后替换成 \.\1\.的形式。
但是\1 这个有问题,无法捕获前面的(\d\d),写成\1,\\1,\\\1,\\\\1 都不行。
请问该如何写,才能 捕获前面的 (\d\d) 呢?
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("%03d,");
}
b.deleteCharAt(b.length() - 1); System.out.println(String.format(b.toString(), ids));
}
*格式转换
*/
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();
}
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
我也湊热闹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);
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
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);
}
}不想替换两次的话,可以手工进行替换处理: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 地址),那可
以采用第一种方式,或者不采用正则表达式的方式。