Java正则表达式常见应用:
1.字符串匹配
2.字符串分析
3.文本替换
4.Scanner定界符
例题1:使用正则表达式匹配输入的字符串(例5.13)
arg相应输入的内容如下
abcabcabcdefabc "abc+" "(abc)+" "(abc){2,}
运行结果:
源代码备忘录:
TestRegex.java
package regex;
import java.util.regex.*;
public class TestRegex {
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("Usage:njava TestRegex "
+ "characterSequence regularExpression+");
System.exit(0);
}
System.out.println("Input: "" + args[0] + """);
for (String arg : args) {
System.out.println("Regular expression: "" + arg + """);
Pattern p = Pattern.compile(arg);
Matcher m = p.matcher(args[0]);
while (m.find()) {
System.out.println("Match "" + m.group() + "" at positions "
+ m.start() + "-" + (m.end() - 1));
}
}
}
}
例题2:字符串分析(例5.14)
用正则表达式对一个由数字和非数字组成的字符串进行分析。要求:将其中每段连续的数字字符转换成一个整数,若连续的数字字符个数超过4个,则以4个数字为一组进行转换,转换生成的整数依次存入整型数组中。例如,对“c789yz45!786*+56abc123456789”分析后得到的数组内容为:789、45、786、56、1234、5678、9。
程序运行结果:
源代码部分:
GetNumber.java
package regex;
import java.util.regex.*;
public class GetNumber {
public static void main(String[] args) {
int[] arr = new int[10]; // 创建1个整型数组
Pattern p = Pattern.compile("(\d{1,4})"); // 编译正则表达式,要求1个到4个数字
String s = "c789yz45!786*+56abc123456789";
Matcher m = p.matcher(s); // 对字符串进行匹配
int i =0;
while(m.find()) { // 寻找与指定模式匹配的下一个子序列
int j = 0;
j = Integer.parseInt(m.group()); // 将字符串类型转换为整型
arr[i]= j;
i++;
}
for(int c = 0;c
例题3:文本替换(例题5.15)
将字符串奇数序列的“java”替换为小写,偶数序列的“java”替换成大写。
运行结果:
源代码部分:
TestReplace.java
package regex;
import java.util.regex.*;
public class TestReplace {
public static void main(String[] args) {
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE); // 不区分大小写
Matcher m = p.matcher("Java java JAva JAVA I love JAVA you dislike Java ");
StringBuffer buf = new StringBuffer();
int i=0;
while(m.find()) {
i++;
if(i%2 == 0) {
m.appendReplacement(buf, "JAVA"); // 偶数序列的转换成大写
} else {
m.appendReplacement(buf, "java"); // 奇数序列的转换成小写
}
}
m.appendTail(buf);
System.out.println(buf);
}
}
例题4:Scanner定界符
使用“.”作为IP地址的定界符(例5.16)
程序结果:
源代码部分:
TestScanner.java
package regex;
import java.util.*;
public class TestScanner {
public static void main(String[] args){
Scanner scanner = new Scanner("192.168.1.99");
scanner.useDelimiter("\s*\.\s*"); // 使用"."作为定界符
while(scanner.hasNextInt())
System.out.println(scanner.nextInt());
}
}
正则表达式相关实验例题:
【实验5.1】统计一个字符串中单词的个数(参考教材p371-372),并思考一下如果单词间包含unicode定义的空白字符,是否能够统计出来?
运行结果:
这里可以借助java自带的一个类进行分割单词的统计工作 并不需要用到正则表达式
源代码部分:
import java.util.*;
public class TestString {
public static void main(String[] args) {
String data = "This is a String";
StringTokenizer st = new StringTokenizer(data);
int count = st.countTokens(); // 计算单词总数
System.out.println("原串是:" + data);
System.out.println("各个单词如下:");
while (st.hasMoreTokens()) { // 还有子串时
String s = st.nextToken(); // 取出下一个子串
System.out.println(s);
}
System.out.println("单词总数:" + count);
}
}
【实验5.2】参考教材p372中EmailSpider.java, 采用正则表达式形式实现一个URL地址提取功能。
提取url地址所采用的正则表达式:
(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]
这里我们采取读取文件的方式 我们不妨在d盘下放一个test.txt文本
接下来我们看一下运行的结果:
源代码部分:
import java.io.BufferedReader;
import java.io.*;
import java.util.regex.*;
public class EmailSpider {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new FileReader("d:\test.txt"));
String line = "";
while((line=br.readLine()) != null) {
parse(line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void parse(String line) {
Pattern p = Pattern.compile("(https?|ftp|file)://[-A-Za-z0-9+&@#/%?=~_|!:,.;]+[-A-Za-z0-9+&@#/%=~_|]"); // 编译正则表达式
Matcher m = p.matcher(line);
while(m.find()) {
System.out.println(m.group());
}
}
}
【实验5.3】编写程序读取一个Java源代码文件,打印出代码中所有普通字符串。
我们这里同样可以通过以上的方法直接读取java的文件
之后通过正则表达式去匹配所有的普通字符串即可(字母数字下划线组成的叫普通字符串 没有其他标点符号等)
之后我们在d盘下放一个用于测试的java文件
运行结果:



