----------------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流! ----------------------
---------------
ASP.Net+Android+IOS开发、
.Net培训、期待与您交流!---------------详细请查看:
http://edu.csdn.net
什么是正则表达式
正则表达式可以针对字符串定义一种格式,可以用来检查字符串是否和这种格式匹配.
正则表达式
(1)正则表达式就是符合一定规则的字符串
(2)规则如下:
A:字符
x 字符 x
\\ 反斜线字符
\n 换行符
B:字符类
[abc] a、b 或 c
[^abc] 任何字符,除了 a、b 或 c
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内
[0-9] 0到9的数字字符
C:预定义字符类
. 任何字符
\d 数字:[0-9]
\w 单词字符:[a-zA-Z_0-9]
单词字符表示的是所有的字母字符和数字字符。
D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
E:Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
[1-9][0-9]{4,14}:1-9出现一次,至少4次,但是不超过14次
F:组
在表达式 ((A)(B(C))) 中,存在四个这样的组: 从左到右计算其开括号来编号
(1)(A)(B(C))
(2)A
(3)B(C)
(4)C
\\1:表示获取第一组,在同一个字符串中
$1:表示获取第一组,在不同的字符串中
叠词:String regex = "(.)\\1+";
(3)正则的功能
A:匹配功能
用的是字符串类的matches方法
举例:判断qq号码,电话号码
B:切割功能
用的是字符串类的split方法
举例:"aa,bb,cc"
"aa.bb.cc"
"aa\\bb\\cc"
"abcddddefgkkkkjhppppad" 叠词切割
C:替换功能
用的是字符串类的replaceAll方法
举例:把所有的数字替换成*号
D:获取功能
用的是Pattern类和Matcher类
步骤:
Pattern p = Pattern.compile(规则);
Matcher m = p.matcher(字符串);
find():是否有符号规则
group():如果有,则获取
举例:获取文本中的邮箱
package cn.itcast.test;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 获取文本文件中的所有邮箱
*
* 参照正则表达式的获取功能来实现。
*
*
*/
public class GetMail {
public static void main(String[] args) throws IOException {
// 邮箱的规则
String regex = "\\w+@\\w+(\\.\\w+)+";
// 读取文本文件
BufferedReader br = new BufferedReader(new FileReader("mail.txt"));
String line = null;
while ((line = br.readLine()) != null) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(line);
while (m.find()) {
System.out.println(m.group());
}
}
}
}
// 判断邮箱是否满足条件
// indexOf('@')!=-1
// String email = "xixi@sina.com.cn";
/*
* abc@qq.com bcd@126.com ha1234ha@163.com xixi@sina.com.cn
*/
// 邮箱的规则
// String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]+)+";
/*
* String regex = "\\w+@\\w+(\\.\\w+)+";
* System.out.println(email.matches(regex));
*/
(4)案例:
A:我爱学编程
package cn.itcast.test;
/*
* 我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程
* 将字符串还原成:“我要学编程”。
*
* 思路:
*
1:去掉.
*
2:叠词保留一个
*/
public class RegexTest {
public static void main(String[] args) {
String str = "我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程";
// 去掉.
// 替换
String regex = "\\.";
String str2 = str.replaceAll(regex, "");
// System.out.println(str2);
// 叠词保留一个
String regex2 = "(.)\\1+";
String str3 = str2.replaceAll(regex2, "$1");
System.out.println(str3);
// String str = "我我..我..我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程";
// String regex = "((.)\\.*)(\\2\\.*)*";
// String s = str.replaceAll(regex, "$2");
// System.out.println(s);
}
}
B:IP地址排序
package cn.itcast.test;
import java.util.TreeSet;
/*
* “192.168.3.23 202.10.34.2 3.3.3.3 127.0.0.1 80.12.23.34”。
* 能将这些ip地址排序。按照地址段数值从小到大排序。
*
* 思路:
*
1:把字符串中的每个ip地址的每一段给补齐3位。在每一段的位置上前面都补2个0.
*
2:如果这个ip地址段的这个值超出3位,将来保留后3位。
*/
public class RegexTest2 {
public static void main(String[] args) {
String ips = "192.168.3.23 202.10.34.2 3.3.3.3 127.0.0.1 80.12.23.34";
// 规则
// 补齐3位
String regex = "(\\d+)";
String ips2 = ips.replaceAll(regex, "00$1");
//
System.out.println(ips2);
// 超过3位,保留后三位
String regex2 = "0*(\\d{3})";
String ips3 = ips2.replaceAll(regex2, "$1");
//
System.out.println(ips3);
// 切割
String[] ipArray = ips3.split(" ");
TreeSet<String> ts = new TreeSet<String>();
for (String str : ipArray) {
//
System.out.println(str);
ts.add(str);
}
//这个时候,字符串数组中已经保存每个ip地址。现在要进行排序。
//我建立TreeSet集合,存储每个字符串
StringBuilder sb = new StringBuilder();
for(String str : ts){
//去掉0
//
System.out.println(str);
String regex3 = "0*(\\d+)";
String s = str.replaceAll(regex3, "$1");
//
System.out.println(s);
sb.append(s).append(" ");
}
String lastIps = sb.toString().trim();
System.out.println(lastIps);
}
}