Java正则表达式

常用的字符有:

\d 数字 
\D 非数字 
\w 单字字符(0-9,A-Z,a-z) 
\W 非单字字符 
\s 空白(空格符,换行符,回车符,制表符) 
\S 非空白 
[] 由方括号内的一个字符列表创建的自定义字符类 
. 匹配任何单个字符 
下面的字符将用于控制将一个子模式应用到匹配次数的过程. 
? 重复前面的子模式0次到一次 
* 重复前面的子模式0次或多次 
+ 重复前面的子模式一次到多次

匹配邮箱的方法:

public static boolean isEmail(String email) {
    String str = "^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$";
    Pattern p = Pattern.compile(str);
    Matcher m = p.matcher(email);
    return m.matches();
}
另外,电话号码的表达式是:

((^(13|14|15|18|17)[0-9]{9}$)|(^0[1,2]{1}\\d{1}-?\\d{8}$)|(^0[3-9] {1}\\d{2}-?\\d{7,8}$)|(^0[1,2]{1}\\d{1}-?\\d{8}-(\\d{1,4})$)|(^0[3-9]{1}\\d{2}-? \\d{7,8}-(\\d{1,4})$))


正则表达式有一个很强大的组,通过组可以做很多事情:

<dimen name="aaaaa">500dip</dimen>
<dimen name="bbbbb">510sp</dimen>
<dimen name="cccccc">520dp</dimen>
......此处省略1000条

比如要将上面的这段XML文件的值乘以1.5,得出新的XML文件。想用自己一条一条更改值肯定是一件苦逼的事,并且也不符合程序猿的做事风格,这时候就可以用到正则表达式轻松搞定了。

思路:

我们把它分成四个部分,标签头 + 数值 + 单位 + 标签尾

然后将它们匹配分组,并计算拼接。(标签头 + 数值*1.5 + 单位 + 标签尾)

实现代码如下:

private static void replaceText(BufferedReader br, BufferedWriter bw) throws Exception {
	Pattern p = Pattern.compile("(<.+>)([1-9]{1}[0-9]{0,3})((di?p)|(sp))(</.+>)");
	String line = "";
	while((line = br.readLine()) != null){
		Matcher m = p.matcher(line);
		if (m.find()) {
			line = m.group(1) + (int)(Float.valueOf(m.group(2))*1.5) + m.group(3) + m.group(6);
		}
		bw.write(line);
		bw.newLine();
	}
}


还有一段替换Layout布局文件中的数量也一并贴上:

private static void replaceText(BufferedReader br, BufferedWriter bw) throws Exception {
	// android:layout_width="300dip" android:layout_height="50dp" android:textSize="25sp"
	Pattern p = Pattern.compile("(android:[a-zA-Z_]+) *= *\" *([1-9]{1}[0-9]{0,3})((di?p)|(sp)) *\"");
	String line = "";
	StringBuilder sb = new StringBuilder();
	while((line = br.readLine()) != null){
		sb.setLength(0);  // 清空StringBuilding
		Matcher m = p.matcher(line);
		while (m.find()) {
			if (sb.length() > 0) sb.append(" ");
			sb.append(m.group(1)).append("=\"").append("@dimen/_").append(m.group(2));
			if ("sp".equals(m.group(3))) {
				sb.append("sp_dimen");
			} else {
				sb.append("dip_dimen");
			}
			sb.append("\"");
			line = null;	// 将line置空
		}
		bw.write(line == null ? sb.toString() : line);	// line为空时,说明没有进循环
		bw.newLine();
	}
}







你可能感兴趣的:(java,正则表达式)