原文链接:
http://www.programcreek.com/2013/10/top-10-questions-for-java-regular-expression/
学习及翻译如下,有理解不对及表达不清的地方,请读者指正!
这里列举了最热门的Java正则表达式问题。由于这些问题经常被问到,所以你可能也会觉得它们很好用。
1、如何从一个字符串中提取数字?
使用正则表达式的一个常见的问题是将所用的数字提取出来放到一个整型数组中。
在Java中,使用“\d ”来表示0~9的数字范围。使用预定义的类型可以使你的程序更具有可读性,并且还能减少错乱字符带来的错误。请参考预定义字符集来了解更多细节的东西。请注意“\d”中第一个反斜杠字符“\”。如果你使用的字符串中带有反斜杠,那你需要在反斜杠前面再添加一个反斜杠,这样才能正常编译出反斜杠。这就是为什么我们使用“\\d”。
举例如下:
List<Integer> numbers = new LinkedList<Integer>();
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher(str);
while (m.find()) {
numbers.add(Integer.parseInt(m.group()));
}
2、如何将字符串按行分割?
根据我们所使用的操作系统,我们有至少三种不同的方式来实现来添加换行符。
1. \r 代表输出返回,在Unix中使用。
2. \n 代表换行,在苹果操作系统中使用。
3. \r\n 代表输出返回并换行,在Windows中使用。
因此,将字符串按行分割的最直接的方法是:
String lines[] = String.split("\\r?\\n");
但是如果你不想要那些空的行的话,可以用以下方法,这也是我最喜欢的方法:
String.split("[\\r\\n]+");
以下是与系统独立的方式。但是如果有两个空行挨在一起,你可能会得多空行。
String.split(System.getProperty("line.separator"));
3、Pattern.compile() 的重要性
一个正则表达式就是一个字符串,必须先被编译成一个Pattern类的实例。而Pattern.compile() 方法是将对象创建成实例的唯一方法。调用顺序如下:
Pattern p = Pattern.compile("a*b");
Matcher matcher = p.matcher("aaaaab");
assert matcher.matches() == true;
基本上,Pattern.compile() 方法是用来将一个正则表达式转换成一个有限的状态集(请参考:
Compilers: Principles, Techniques, and Tools (2nd Edition)这本书)。但是所有的状态在比对时,都会保留其匹配状态。通过这种方式,Pattern的实例p可以被重复使用。并且很多匹配器可以共用相同的模板。
Matcher anotherMatcher = p.matcher("aab");
assert anotherMatcher.matches() == true;
Pattern.matches() 方法在使用正则表达式时是很方便的。这个方法使用compile() 来获取一个Pattern类的实例,并匹配一个字符串。因此下面这行代码和上面的代码是一样的效果的。
boolean b = Pattern.matches("a*b", "aaaaab");
4、如何摆脱正则表达式的文本?
一般来说,在正则表达式中,都会使用到反斜杠,但是在Java中,为了使字符串能够编译通过,我们不得不痛苦的在反斜杠前使用新的反斜杠。有另一种方法能帮助用户定义Pattern类型字符串,比如“$5”。为了替代“\\$5”,我们可以这样定义:
Pattern.quote("$5");
5、为什么String.split()这个方法需要限定符来退出?
String.split()通过给定的正则表达式把字符串分割。Java提供一种叫做“元配符”的特殊符号来影响pattern的匹配过程。“|”就是一个用来匹配一个正则表达式的几种可能的正则表达式的特殊符号。举个例子,A|B 表示A或者B。因此当需要使用“|”时,要在其前面使用反斜杠来表示,如:“\\|”。