写在前面
在做实验的时候,需要读入文件。由于读入的信息以字符串的形式存储的,并且文件是按照一定的格式进行书写的,因此要得到对应的信息,就需要匹配每个字符串,这个时候就需要用到正则表达式。由于之前并没有特意去学习过正则表达式,现在用到了,简单地分享一下我所学的正则表达式。
介绍
在学正则表达式之前,总要知道这个是什么,用来做什么。官方地说,正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。我对正则表达式的理解,就是用来匹配字符串的,在字符串中找到我们需要的信息,然后进行处理。其中的首要任务就是在一堆字符串,找到我们需要的子串。
《java编程思想》中是这样描述的:
- 正则表达式就是以某种方式来描述字符串,因此你可以说:“如果一个字符串含有这些东西,那么它就是我正在找的东西。”例如,要找一个数字,它可能有一个负号在最前面,那你就写一个负号加上一个问号,就像这样:
-?
基本用法
我们最先知道的正则表达式工具应该是split()方法,它将字符串从正则表达式匹配的地方切开。虽然之前一直在用,但直到最近才知道它就是传说中的正则表达式。
正则表达式有一些基本的语法:
\
的转义
在学语法的时候,我们直到\
表示转义,在java正则表达式中,也需要使用\
进行转义,不过,如果要表示\
在表达式中,需要使用双斜杠\\
表示转义。
例如,当需要表示一位数字的时候,正则表达式应该是\\d
字符
B 表示指定字符B(类似的,A就表示字符A,a就表示字符a)
\n 换行(一些转义与C语言相同,,还有\t等)
\xhh `\` 后面接十六进制,表示oxhhhh的Unicode字符
字符类
. 任意字符
[abc] 包含a、b和c的任何字符(等同于a|b|c)
[^a] 除a以外的任何字符
\s 空白字符(空格、tab、换行、换页和回车)
边界匹配符
^ 一行的起始
$ 一行的结束
\b 词的边界
语法其实还是比较多的,用到什么直接查就好了,本文并不是词典,就不一一罗列了。
推荐查看这篇文章的语法范例。
写到这里,大家应该对正则表达式有一个基本的概念了,那么它是如何使用的呢?下面我们进行一些代码实战。
实验
为了利用正则表达式,我们利用java中的regex包,利用其中的 Matcher 类和 Pattern 类,具体说明见官方文档 javaAPI。使用方法见如下代码,本文所有的代码都利用这两个类进行匹配。
另外,再介绍一个group方法,用于取出匹配到的字符串。
注意 :group(0)返回的是被匹配的字符串,需要从group(1)开始。
- 最简单的匹配就是直接匹配一个字符:
String string = "A";
String pattern = "([a-zA-Z])";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(string);
if (m.find()) {
System.out.println("Found : " + m.group(1));
}
输出结果:Found : A
- 也可以利用+的语法来匹配字符串 (+ 表示出现一次或多次)
String string = "ABCD";
String pattern = "([a-zA-Z]+)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(string);
if (m.find()) {
System.out.println("Found : " + m.group(1));
}
Found : ABCD
这样,我们就可以组合起来。
- 实验中的案例:
实验中要匹配的一种字符串为:Vertex = <\”Server1\”, \”Server\”, <\”192.168.1.2\”>>
那么,就可以利用上面所学的知识,组合起来匹配这样的字符串,代码如下:
String string = "Vertex = <\"Server1\", \"Server\", <\"192.168.1.2\">> ";
String pattern = "\"([a-zA-Z0-9]+)\",\\s*\"([a-zA-Z0-9]+)\",\\s*<\"([a-zA-Z0-9.]+)\">";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(string);
if (m.find()) {
System.out.println("Found value: " + m.group(1));
System.out.println("Found value: " + m.group(2));
System.out.println("Found value: " + m.group(3));
} else {
System.out.println("NO MATCH");
}
运行结果:
Found value: Server1
Found value: Server
Found value: 192.168.1.2
注意:这里的 *
表示的是0个或多个,区别于 +
的1个或多个。
实验中可以使用的方法很多,这只是最通俗的一种,可以根据自己的喜好随意更改。
结论
正则表达式是一种非常有效的处理字符串的方式,希望大家能够通过这篇文章对正则表达式有基本的认识。