对于Java中正则表达式的一点理解

因为以后要搞安卓开发,以前又没怎么学习过Java,趁着现在没有正式进入部门之前就想先把Java在重新学习一下,为自己以后的职业道路做好充分准备

我们都知道正则表达式在编程中是经常使用的,判断邮箱格式是否正确,判断某一个字符串是否包含某一个子串,字符串的分割和替换等等,正确地使用正则表达式在很多场合都会给我们带来很多方便和效率,我就根据自己看书和理解,以及到网上发帖询问获得的知识,来简单地谈一下关于正则表达式。
在使用正则表达式之前,我们需要导入java.util.regex这个库,你需要先使用Pattern.compile()方法编译正则表达式,注意这是一个静态方法(类方法,可以直接使用类名调用),它根据输入的字符串参数生成一个Pattern对象,例如:

1
private static Pattern p = Pattern.compile("\\w+\\.");

在本例中,输入的参数是"\\w+\\.",想要理解这个以及其他的正则表达式,你可以查看JDK文档中的java.util.regex.Pattern这里的\w代表一个构成词的字符[a-zA-Z_0-9]。+代表一个或者多个前述的表达式(关于其他字符的含义,大家可以查看正则表达式中的详细含义),所以这个例子表示,一个或多个构成词的字符。\.产生一个字面常量的点号(不能直接用点号,那在正则表达式中代表”任何字符”)。所以这个表达式会匹配任何”由一个或多个字符构成的单词,并且其后紧跟一个点号”

在编译了一个Pattern对象之后,可以通过调用matcher()方法使用它,只需把你想要查找的字符串传递给它。matcher()方法生产一个Matcher对象,这个对象包含一组用来从目标对象中做选择的操作

下面我们来看一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FindGroup {
private static int count;
public static void main(String[] args){
    Matcher m = Pattern.compile("\\w+").matcher("Java isn't easy!");
    //Matcher m = Pattern.compile("\\w+").matcher("Java is very easy!");
    while(m.find()){
       count++;
       System.out.println(m.group());
}
    System.out.println(count);
}
}

这个例子的输出是:

1
2
3
4
5
Java
isn
t
easy
4

可能有些网友会觉得好奇,会认为到第一个空格的时候程序就应该停啊,应该是只匹配第一个空格之前的单词啊?其实并非如此,我们可以看一下find()函数的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public boolean find() {
int nextSearchIndex = last;
if (nextSearchIndex == first)
    nextSearchIndex++;

// If next search starts before region, start it at region
if (nextSearchIndex < from)
    nextSearchIndex = from;

// If next search starts beyond region then it fails
if (nextSearchIndex > to) {
    for (int i = 0; i < groups.length; i++)
        groups[i] = -1;
    return false;
}
return search(nextSearchIndex);
}

find()像一个迭代器,从头到尾扫描一遍字符串。由于在上面的例子中,无法匹配空格和,所以在空格和处会断开,于是输出结果就如上面所示。group()是返回匹配到的字符串