Java 正则表达式入门
2017-07-23 15:43
232 查看
Java 正则表达式入门
正则表达式是什么?编程中时常会遇到解析字符串的问题,比如判断一个字符串是否是邮箱,判断一个字符串是否是电话号码等。甚至需要提取字符串中的某些部分。
可能你会说这很简单啊, String 类那么强大,我每次都是用它来进行字符串处理的。可是这对于复杂的字符串其实是很难的,需要写大量的逻辑代码,可能花了好大力气,程序写的还不够健壮。而正则表达式正好可以轻松的解决字符串的处理问题。
最早, 正则表达式是科学家提出来解决自然语言识别的一种技术,现在它已经成为了一种解析字符串的工具,各编程语言都对正则表达式提供了支持。
其实,本质上程序还是执行了大量的处理,只是这种技术帮我们代劳了,程序员只要使用它暴露出来的方法去调用就可以了,这就是俗称的造轮子和搬砖。
正则表达式其实就是由普通字符(大小写字母,数字)和特殊字符(也称元字符)组成的一个字符串模板,如:.+/(.+)$ 。这是最难的,也是最重要的,如果你不想全部弄懂,也可以需要时去网上搜,这样也可以。
下面展示下常用的元字符的用法:
Java 中怎么使用正则表达式呢?
Java 提供了两个类来供程序员使用正则表达式,分别是 Pattern 和 Matcher ,它们都位于 java.util.regex 包中。
这两个类都使用了 final 关键字修饰,就是说他们不想要别的类去继承他,他们要保证自己的不可替代性,而且都没有构造函数。
使用模板:
Pattern p = Pattern.compile(regex); //此方法把正则表达式模板封装成Pattern (模板)对象 Matcher m = p.matcher(path); //通过此方法将模板对象和字符串匹配,得到的结果封装成 Matcher (匹配器) 对象中,通过这个匹配器对象的方法可以得到匹配的所有信息。
下面展示几个例子:
提取路径后的文件名
String path = "C:/a/n/note.txt"; String regex = ".+/(.+)$";//正则表达式模板 Pattern p = Pattern.compile(regex);//此方法把正则表达式模板封装成Pattern (模板)对象 Matcher m = p.matcher(path);//通过此方法将模板对象和字符串匹配,得到的结果封装成 Matcher (匹配器) 对象中,通过这个匹配器对象的方法可以得到匹配的所有信息。 if(!m.find()) { System.out.println("格式不对"); }else { System.out.println(m.group(1)); }
判断是否为邮箱号码,即必须为六位数号码
System.out.println(Pattern.matches("[0-9]{6}", "332200"));//如果只匹配一次,可以直接调用 Pattern 的 matches() 方法,这样更方便,匹配成功返回 true,否则返回 false 。 System.out.println(Pattern.matches("\\d{6}", "a32200"));
判断是否是身份证号码,即判断是否是 15 或 18 位数字
System.out.println(Pattern.matches("\\d{15}|\\d{18}", "360481199601262616"));
判断是合法的邮箱地址
boolean IsEmail(String email){ Pattern p = p.compile("[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z0-9]+"); Matcher m = p.matcher(email); if(m.matches()){ System.out.println("合法"); }else { System.out.println("不合法"); } }
解析 URL
String path = "http://www.csdn.net/article/1970-01-01/2819623"; String regex = "([a-zA-Z]+)://([^/:]+)([^#]*)"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(path); if(!m.find()) { System.out.println("格式不对"); }else { System.out.println(m.group(1)); System.out.println(m.group(2)); System.out.println(m.group(3)); } //使用 Matcher 的 group() 方法一定要事先调用 find() 方法,否则编译不通过
通过几个例子发现,正则表达式的精髓就在于怎么组合元字符,最好的方式就是用到一个学一个吧,就不多解释了。