常用的字符有:
\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(); } }