您的位置:首页 > 编程语言 > Java开发

< 笔记 > Java SE - 10 Java SE 正则表达式

2017-10-06 14:23 555 查看

10 Java SE 正则表达式

By Kevin Song

概述

作用:操作字符串数据

public class RegexDemo {
public static void main(String[] args) {
String qq = "303043149";
//第一位1到9
//第二位0到9
//第二位0到9出现4到14次
String regex = "[1-9][0-9]{4,14}";//正则表达式
boolean b = qq.matches(regex);
System.out.println(qq+b);
}
public static void checkQQ(String qq) {
int len = qq.length();
if(len>=5 %% len<=15) {
if(!qq.startsWith("0")) {
try {
long l Long.parseLong(qq);
} catch(NumberFormatException e) {
System.out.println("非法字符");
}
} else {
System.out.println(qq+":不能0开头");
}
} else {
System.out.println(qq+"长度错误");
}
}
}


常见的规则

字符类含义
[abc]a、b 或 c(简单类)
[^abc]任何字符,除了 a、b 或 c(否定)
[a-zA-Z]a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]]a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]]d、e 或 f(交集)
[a-z&&[^bc]]a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]]a 到 z,而非 m 到 p:[a-lq-z](减去)
预定义字符类含义
.任何字符(与行结束符可能匹配也可能不匹配)
\d数字:[0-9]
\D非数字: [^0-9]
\s空白字符:[ \t\n\x0B\f\r]
\S非空白字符:[^\s]
\w单词字符:[a-zA-Z_0-9]
\W非单词字符:[^\w]
边界匹配器含义
^行的开头
$行的结尾
\b单词边界
\B非单词边界
\A输入的开头
\G上一个匹配的结尾
\Z输入的结尾,仅用于最后的结束符(如果有的话)
\z输入的结尾
Greedy数量词
X?X 一次或一次也没有
X*X 零次或多次
X+X 一次或多次
X{n}X 恰好 n 次
X{n,}X 至少 n 次
X{n,m}至少 n 次,但是不超过 m 次
Logical 运算符含义
XYX 后跟 Y
XY
(X)X,作为捕获组
Ba
cab7
ck 引用
含义
\n任何匹配的 n^th 捕获组
组的概念

((A)(B(C)))

1 ((A)(B(C)))

2 \A

3 (B(C))

4 (C)

组零始终代表整个表达式

常见功能

正则表达式对字符串的常见操作

匹配

使用String类中的matches方法

切割

使用String类中的split方法

替换

使用String类中的replaceAll方法

获取

将正则表达式封装成对象

Pattern p = Pattern.compile(“a*b”);

通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher

Matcher m = p.matcher(“aaaaab”);

通过Matcher匹配其对象的方法对字符串进行操作

boolean b = m.matches();

public class RegexDemo2 {
public static void main(String[] args) {
functionDemo_4();
}
/*获取

*/
public  static void functionDemo_4() {
String str = "da jia hao,ming tian bu fang jia!";
/*
获取三个字母的单词[a-z]{3}

*/
String regex = "\\b[a-z]{3}\\b";
//把正则封装成对象
Pattern p = Pattern.compile(regex);
//通过正则对象获取匹配器对象
Matcher m = p.matcher(str);

//使用Matcher对象的方法对字符串进行操作
//要获取三个字母组成的单词,用find()方法
System.out.println(str);
while(m.find()) {
System.out.println(m.group());//获取匹配的子序列
System.out.println(m.start()+":"+m.end());//获取字母开始和结束位置,包头不包尾
}
}
//替换
public static void functionDemo_3() {
String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
/*
把.用()封装成组(.)
组的编号为\\1
编号为1的组出现过一次或者多次所以(.)\\1+
获取编号1组里的字母并且替换$1
*/
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);

String tel = "15800001111";//158****1111;
/*
前三个数封装成编号为1的组(\\d{3})
末四个数封装成编号为2的组(\\d{4})
*/
tel = tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");

System.out.println(tel);
}
//切割
public static void functionDemo_2(){
String str = "zhangsan    xiaoqiang   zhaoliu";
String[] names = str.split(" +");//一次或多次空格

String str = "zhangsan.xiaoqiang.zhaoliu";
String[] names = str.split("\\.");//用.来切,\\转义

String str = "zhangsanttttxiaoqiangmmmmmmzhaoliu";
/*
把.用()封装成组(.)
组的编号为\\1
编号为1的组出现过一次或者多次所以(.)\\1+
*/
String[] names = str.split("(.)\\1+");/

for(String name : names){
System.out.println(name);
}
}
//匹配
public static void functionDemo_1(){
//匹配手机号码是否正确
String tel = "15800001111";
/*
第一位固定1
第二位是3,5,8中的一个[358]
第三位开始[0-9]用预定义字符类表示\\d重复9次
*/
String regex = "1[358]\\d{9}";
boolean b = tel.matches(regex);
System.out.println(tel+":"+b);
}
}


正则表达式练习

练习一

过滤信息

We….neeeeeed..baa…aaack……uuu..up

ip地址排序

192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55

邮件地址校验

public class RegexTest {
public static void main(String[] args) {
test_1();
}
public static void test_1 {
String str = "We....neeeeeed..baa...aaack......uuu..up";
//去掉...
str = str.replaceAll("\\.+"," ");
//替换叠词
str = str.replaceAall("(.)\\1+","$1");
System.out.println(str);
}
public static void test_2 {
String ip_str = "192.168.10.34 127.0.0.1 3.3.3.3 105.70.11.55";
//为了让ip可以按照字符串顺序比较,只要让ip的每一段的位数相同
//补零,每一段加2个0
ip_str = ip_str.replaceAll("(\\d+)","00$1");
//00192.168.10.34 00127.0.0.1 003.3.3.3 00105.70.11.55
System.out.println(ip_str);
//每一段保留数字三位
ip_str = ip_str.replaceAll("0*(\\d{3})","$1");
//192.168.10.34 127.0.0.1 003.3.3.3 105.70.11.55
System.out.println(ip_str);

//把ip地址切出
str = str.split(" +");

TreeSet<String> ts = new TreeSet<String>();

for(String ip : ips) {
ts.add(ip);
}
for(String ip : ts) {
//0没有或者多次后跟着连续数字
//用连续的数字替换带0的那部分
System.out.println(ip.replaceAll("0*(\\d+)", "$1"));
}
public static void test_3 {
String mail = "abc@sina.com";
/*
第一部分大小写字母数字下划线都可以一个或者多个[a-zA-Z0-9_]+
第二部分固定@
第三部分大小写字母数字都可以一个或者多个[a-zA-Z0-9]+
第四部分(\\.字母出现1到3次)出现一次或者多次(\\.[a-zA-Z]{1,3})+
*/
String regex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+\\.[a-zA-Z]{1,3})+";
regex = "\\w+@\\w+(\\.\\w+)+";
boolean b = mail.matches(regex);
System.out.println(mail+":"+b);
}
}
}


网页爬虫

定义:在互联网中获取符合指定规则数据的程序

public class RegexTest2 {
public static void main(String[] args) throws IOException {
List<String> list = getMailsByWeb();
for(String mail : list){
System.out.println(mail);
}
}
public static List<String> getMailsByWeb() throws IOException {
//1, 读取源文件
//BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));
URL url = new URL("http://192.168.1.100:8080/myweb/mail.html");
BufferedReader bufIn = new BufferedReader(new InputStreamReader(url.openStream()));
//2,对读取的数据进行规则的匹配,从中获取符合规则的数据
String mail_regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while((line=bufIn.readLine())!=null){
Matcher m = p.matcher(line);
while(m.find()){
//3,符合规则的数据存储到集合中
list.add(m.group());
}
}
return list;
}
public static List<String>  getMails() throws IOException{
//1, 读取源文件
BufferedReader bufr = new BufferedReader(new FileReader("c:\\mail.html"));
//2,对读取的数据进行规则的匹配,从中获取符合规则的数据
String mail_regex = "\\w+@\\w+(\\.\\w+)+";
List<String> list = new ArrayList<String>();
Pattern p = Pattern.compile(mail_regex);
String line = null;
while((line=bufr.readLine())!=null){
Matcher m = p.matcher(line);
while(m.find()){
//3,符合规则的数据存储到集合中
list.add(m.group());
}
}
return list;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: