Java字符串正则处理
内容简介
- Java 正则处理常用模式字符
- 字符串文本匹配,即调用模式类
Pattern
和匹配器类Matcher
。 - 字符串替换,即
String
的实例方法replaceAll()
- 字符串分割
- 增强
for
循环 (for each
循环)
Java字符串正则处理
正则表达式具有强大的文本匹配功能。JDK正则包 java.util.regex
包含模式类 Pattern
和匹配器类 Matcher
,使用正则表达式所订制的模式对字符串进行匹配。通过查看源码可知,String
的正则处理实质上是调用模式类 Pattern
和匹配器类 Matcher
。
Java 正则处理常用模式字符
增强型for循环。
增强 for
循环 (也称 for each
循环) 是迭代器遍历方法的一个“简化版”,是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合。
其内部原理是一个 Iteration
迭代器,在遍历数组/集合的过程中,不能对集合中的元素进行增删操作。
for(变量类型 变量名:集合对象) {
// 循环体
}
注意的事项
1.增强for循环底层也是使用了迭代器获取的,在使用增强for循环遍历元素的过程中不准使用集合对象对集合的元素个数进行修改。
2.迭代器与增强for循环遍历元素的区别:使用增强for循环遍历集合的元素时,不能调用迭代器的remove方法删除元素,而使用迭代器遍历集合的元素时可以删除集合的元素。
3.增强for循环和普通for循环的区别:普通for循环可以没有遍历的目标,而增强for循环一定要有遍历的目标。
实验要求
(1)新建类 RegexDemo
,并创建 main()
方法体。
(2)在 main()
方法体内,使用 Pattern.matches()
并编写正则表达式,匹配中国省会城市的电话号码。即:
0aa-dddddddd
。其中,以数字0打头,aa是城市区号,dddddddd
是8位电话号码。
(3)新建方法 testRegex2()
,并添加注解 @Test
。
(4)在方法体内,使用类 String
的实例方法 replaceAll()
,获取手机归属地查询的有效信息(【1552764】湖北武汉湖北联通GSM卡,即过滤了无效的 xml
标签信息)。
提示:需要正则处理的 xml
文档的内容如下:
String source="<?xml version=\"1.0\"encoding=\"utf-8\"?>\n"+
"<stringxmlns=\"http://WebXml.com.cn/\">【1552764】湖北武汉湖北联通GSM卡</string>";
(5)创建一个值为 Java,Java EE,Android
的字符串对象 courses
,对它应用String
的实例方法 split()
,分离出3门课程得到一个字符串数组后,使用增强型 for
循环遍历该字符串数组
代码参考
1. 新建类 RegexDemo
,并创建 main()
方法体。
// 新建类RegexDemo,并创建main()方法体。
public class RegexDemo {
public static void main(String[] args) {
}
}
2. 在 main()
方法体内,使用 Pattern.matches()
并编写正则表达式,匹配中国省会城市的电话号码。
public static void main(String[] args) {
// 在main()方法体内,使用Pattern.matches()并编写正则表达式,匹配中国省会城市的电话号码。
// 创建一个Scanner类型的对象scanner。
System.out.println("请输入中国省会城市的电话号码: ");
Scanner scanner = new Scanner(System.in);
String phoneNumber = scanner.nextLine();
// 静态方法Pattern.matches(正则表达式,字符串)用于测试字符串是否匹配正则表达式
if (Pattern.matches("0\\d{10}", phoneNumber)) {
System.out.println("号码正确!");
} else {
System.out.println("号码输入有误!");
}
}
3. 新建方法 testRegex2()
,并添加注解 @Test
。
首先在项目的pom.xml里,添加JUnit测试依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
新建方法 testRegex2()
,添加注解 @Test
@Test
public void testRegex2() {
}
4. 在方法体内,使用类 String
的实例方法 replaceAll()
,获取手机归属地查询的有效信息
@Test
public void testRegex2() {
// 在方法体内,使用类String的实例方法replaceAll(),获取手机归属地查询的有效信息
String source = "<?xml version=\"1.0\"encoding=\"utf-8\"?>\n" +
"<stringxmlns=\"http://WebXml.com.cn/\">【1552764】湖北武汉湖北联通GSM卡</string>";
// 从<或</开始到>结束的若干字符替换为空串。
String result = source.replaceAll("</?[^>]+>", "").trim(); //正则处理
System.out.println(result); //输出:【1552764】湖北武汉湖北联通GSM卡
}
5. 创建一个值为 Java,Java EE,Android
的字符串对象 courses
,对它应用String
的实例方法 split()
,分离出3门课程得到一个字符串数组后,使用增强型 for
循环遍历该字符串数组
// 创建一个值为"Java,Java EE,Android"的字符串对象courses
String course = "Java,Java EE,Android";
// 对它应用String的实例方法split()
String[] courseArray = course.split(","); // 字符串分割
for (String aCourse : courseArray) {
System.out.println(aCourse);
}
完整代码
package unit02;
// (1)新建类RegexDemo,并创建main()方法体。
// (2)在main()方法体内,使用Pattern.matches()并编写正则表达式,匹配中国省会城市的电话号码。即:
// 0aa-dddddddd。其中,以数字0打头,aa是城市区号,dddddddd是8位电话号码。
// (3)新建方法testRegex2(),并添加注解@Test。
// (4)在方法体内,使用类String的实例方法replaceAll(),获取手机归属地查询的有效信息(【1552764】湖北武汉湖北联通GSM卡,即过滤了无效的xml标签信息)。
// 提示:需要正则处理的xml文档的内容如下:
// String source="<?xml version=\"1.0\"encoding=\"utf-8\"?>\n"+
// "<stringxmlns=\"http://WebXml.com.cn/\">【1552764】湖北武汉湖北联通GSM卡</string>";
// (5)创建一个值为"Java,Java EE,Android"的字符串对象courses,对它应用String的实例方法split(),
// 分离出3门课程得到一个字符串数组后,使用增强型for循环遍历该字符串数组
import org.junit.Test;
import java.util.Scanner;
import java.util.regex.Pattern;
// 新建类RegexDemo,并创建main()方法体。
public class RegexDemo {
public static void main(String[] args) {
// 在main()方法体内,使用Pattern.matches()并编写正则表达式,匹配中国省会城市的电话号码。
// 创建一个Scanner类型的对象scanner。
System.out.println("请输入中国省会城市的电话号码: ");
Scanner scanner = new Scanner(System.in);
String phoneNumber = scanner.nextLine();
// 静态方法Pattern.matches(正则表达式,字符串)用于测试字符串是否匹配正则表达式
if (Pattern.matches("0\\d{10}", phoneNumber)) {
System.out.println("号码正确!");
} else {
System.out.println("号码输入有误!");
}
// 创建一个值为"Java,Java EE,Android"的字符串对象courses
String course = "Java,Java EE,Android";
// 对它应用String的实例方法split()
String[] courseArray = course.split(","); // 字符串分割
for (String aCourse : courseArray) {
System.out.println(aCourse);
}
}
@Test
public void testRegex2() {
// 在方法体内,使用类String的实例方法replaceAll(),获取手机归属地查询的有效信息
String source = "<?xml version=\"1.0\"encoding=\"utf-8\"?>\n" +
"<stringxmlns=\"http://WebXml.com.cn/\">【1552764】湖北武汉湖北联通GSM卡</string>";
// 从<或</开始到>结束的若干字符替换为空串。
String result = source.replaceAll("</?[^>]+>", "").trim(); //正则处理
System.out.println(result); // 输出:【1552764】湖北武汉湖北联通GSM卡
}
}
参考书目:吴志祥《JAVA编程技术》