正则表达式
解释:就是符合一定规则的表达式
作用:用于专门操作字符串
特点:用一些特定的符号来表示一些代码操作,这样就简化书写
好处:可以简化对字符串的复杂操作
弊端:符号定义越多,正则越长,阅读性越差
具体操作功能:
1, 匹配:String matches()方法
常用:
[^abc] 任何非abc的字符
. 任何字符
\d 代表数字,相当于[0-9]
* 代表0个或多个
+ 代表1个或多个
public static void checkQQ() {
String qq = "123123";
String qq1 = "021312";
String qq2 = "123";
// 正则表达式[]代表内容,{}代表位数
// 第一位不能为0,从第二位开始为数字,需要4-14位0-9的数字
String qqRegex = "[1-9][0-9]{4,14}";
System.out.println(qq.matches(qqRegex));
System.out.println(qq1.matches(qqRegex));
System.out.println(qq2.matches(qqRegex));
}
2,String 的split()切割方法,按正则表达式切割
public class RegexDemo {
public static void main(String[] args) {
String str = "heima lisi Rhythm zhangsan";
String reg = " +";
splitDemo(str, reg);
System.out.println("------------");
// 解析地址
String str1 = "c:\\abc\\haha.txt";
String reg1 = "\\\\";
// String reg1 = "(\\)\\1";
splitDemo(str1, reg1);
// 按照叠词进行切割如ff
/*
* 第二位需要用到第一位的结果
* 定义组
* 要重用的部分用()封装起来,组自动编号 (.)\1 \1代表第一组 相当于 ..
*/
String str2 = "sdfffsdgrrsdafkka";
// 第一位匹配任意字符,封装成组,编号1,第二位接着使用第一位的匹配
String reg2 = "(.)\\1+";
splitDemo(str2, reg2);
}
public static void splitDemo(String str, String reg) {
// split方法传入的参数是正则表达式,特殊字符应该使用转义字符
String[] arr = str.split(reg);
for (String s : arr) {
System.out.println(s);
}
}
}
3,replace()方法,将按正则表达式匹配出的字符替换成指定字符
public class ReplaceDemo {
// 将字符串中符合正则表达式的字符替换成指定字符
public static void main(String[] args) {
String str = "sdfasd12345678";
// 匹配5个或5个以上的数字
String reg = "\\d";
String str1 = "*";
replaceDemo(str, reg, str1);
// 将叠词替换成一个,使用$获取前面规则中的组
String s = "adffffdsdggggsdfsaeeead";
String reg1 = "(.)\\1+";
// 获取上面规则的第一组,如ffff,则获得f
String s1 = "$1";
replaceDemo(s, reg1, s1);
}
public static void replaceDemo(String str, String reg, String str1) {
str = str.replaceAll(reg, str1);
System.out.println(str);
}
}
4,按照规则获取指定子串
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//获取:将字符串中的符合规则的子串取出
/*
* 操作步骤:
* 1,将正则表达式封装成对象(Parttern用来将规则封装成对象)
* 2,让正则对象和要操作的字符串相关联(Matcher匹配器,与要匹配的字符串相关联,然后可以按指定匹配规则匹配)
* 3,关联后,获取正则匹配引擎
* 4,通过引擎对符合规则的子串进行操作,比如取出
*
* Matcher类中有个方法String group(),返回由以前匹配操作所匹配的输入子序列
* 获取匹配后的结果
* */
public class RegexDemo2 {
public static void main(String[] args) {
String str = "01231231";
String reg = "[1-9]\\d*";
// 将规则封装成对象
Pattern p = Pattern.compile(reg);
// 让正则对象和要作用的字符串相关联,m就是匹配器,将多个操作方式封装到了匹配器中
Matcher m = p.matcher(str);
System.out.println(m.matches());
System.out.println("-------getDemo()");
getDemo();
}
public static void getDemo() {
String str = "wo yao qu heima";
// \b单词边界
String reg = "\\b[a-z]{2}\\b";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
// 将规则作用到字符串上,并进行符合规则的子串查找
// System.out.println(m.find());
// 返回符合查找的子串
// System.out.println(m.group());
while (m.find()) {
System.out.println(m.group());
System.out.println(m.start() + "---" + m.end());
}
}
}
练习:
//练习:
//将"我我....我我..我要要要...学..学学...编程",转换成我要学编程
public class RegexTest {
public static void main(String[] args) {
String str = "我我....我我..我要要要...学..学学...编程";
// 去掉点
str = str.replaceAll("\\.+", "");
System.out.println(str);
// 去掉重复的字
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
}
对ip和邮件进行匹配:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/*
* 需求:
* 将ip地址进行地址端顺序的排序
* 按照字符串自然顺序,只要让它们每一段都是3位即可
* 1,按照每一段需要的最多的0进行补齐,那么每一段就会至少保证有3位
* 2,将每一段只保留3位,这样,所有的ip地址都是每一段3位
* "192.168.1.254 102.137.3..13 10.0.0.1 10.2.3.4 2.3.4.6"
* */
public class RegexTest1 {
public static void main(String[] args) {
String ip = "192.168.1.254 102.137.3.13 10.0.0.1 10.2.3.4 2.3.4.6";
// 匹配每一段的数字,在前面加上2个0
String reg = "(\\d+)";
ip = ip.replaceAll(reg, "00$1");
// 将每一段只保留三位
ip = ip.replaceAll("0*(\\d{3})", "$1");
System.out.println(ip);
String[] arr = ip.split(" +");
// 排序:方法一,存入到TreeSet集合中
// TreeSet<String> ts = new TreeSet<String>();
// for (String s : arr) {
// ts.add(s);
// }
// System.out.println(ts.toString());
// 方法二:
// Arrays.sort(arr);
// for (String s : arr) {
// System.out.println(s);
// }
// 方法三:存储到List集合中
List<String> list = new ArrayList<String>();
for (String s : arr) {
list.add(s);
}
Collections.sort(list);
// 排完序后,去除多余的0
for (String s : list) {
s = s.replaceAll("0*(\\d+)", "$1");
System.out.println(s);
}
// System.out.println(list.toString());
checkMail();
}
// 对邮件地址进行校验
public static void checkMail() {
String mail = "cloud112@sina.com";
String reg = "[a-zA-Z0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";// 较为精确的匹配
// \\w代表[a-zA-Z0-9]
String reg1 = "\\w+@\\w+(\\.\\w+){1,3}";// 不太精确匹配,后缀名带数字也可以通过
System.out.println(mail.matches(reg));
}
}
网页爬虫:
public class RegexTest2 {
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:8080/myweb/mail.html");
URLConnection conn = url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line = null;
String mailreg = "\\w+@\\w+(.\\w){1,3}";
Pattern p = Pattern.compile(mailreg);
while ((line = br.readLine()) != null) {
Matcher m = p.matcher(line);
while (m.find()) {
System.out.println(m.group());
}
}
}
}