正则表达式:符合一定规则的表达式
作用:用于专门操作字符串
特点:用于一些特定的符号来表示一些代码操作,简化书写,所以学习正则表达式,就是在学习一些特殊符号的使用
好处:可以简化对字符串的复杂操作
弊端:符号定义越多,正则越长,阅读性越差
具体操作功能:
1. 匹配: String matches方法,用规则匹配整个字符串,只要一出匹配不符合就匹配结束,返回false
2. 切割:String split(Stringregex)
3. 替换:StringreplaceAll();
4. 获取(
操作步骤:
1. 将正则表达式封装成对象
2. 让正则对象和要操作的字符串相关联
3. 关联后,获取正则匹配引擎
4. 通过引擎对符合规则的子串进行操作,比如取出.
package mypackage.regex;
import static system.out.Sop.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
public static void main(String[] args) {
//checkQQ("1237676");
//checkTel("13789354946");
//splitDemo("zhangsan.lisi.wangwu","\\.");
// splitDemo("c:\\abc\\a.txt","\\\\");
// splitDemo("fsaflkfjlkqqfdskkkkksoladsdf","(.)\\1+");//
// 按照叠词分割,为了可以让规则的结果被重用
// 可以将规则封装成一个组,用()完成,组的出现都有编号,从1开始,想要使用已有的组可以通过\n的形式来获取
// String str ="wer1399873298ty29320920sdi345ouiw4348799283f";
// replaceAllDemo(str,"\\d{5,}", "#"); // 将连续的多余5个的数字替换成#
// String str1 = "erkkktyqqqquizzzzzo";
// replaceAllDemo(str1,"(.)\\1+", "&");// 将叠词替换成&号
// replaceAllDemo(str1,"(.)\\1+", "$1"); // 将叠词替换成单个的字母zzzz->z
// $符合在组外引用组
getDemo();
}
// 获取
private static void getDemo() {
String str = "ming tianjiu yao fangjia le,da jia";
String reg = "\\b[a-z]{3}";
// 将正则表达式封装成对象
Pattern p = Pattern.compile(reg);
// 让正则对象和要操作的字符串相关联,获取正则匹配引擎
Matcher m = p.matcher(str);
// 通过引擎对符合规则的子串进行操作,比如取出
while (m.find()) {
sop(m.group());
}
}
// 替换
private static void replaceAllDemo(String str, String regex,
String replacement) {
str = str.replaceAll(regex, replacement);
sop(str);
}
// 切割
private static void splitDemo(String str, String regex) {
String[] arr = str.split(regex);
sop(arr.length);
for (String s : arr) {
sop(s);
}
}
// 匹配
private static void checkTel(String str) {
String regex = "1[358]\\d{9}";
boolean flag = str.matches(regex);
if (flag)
sop(str + "...isok");
else
sop(str + "...不合法");
}
// 匹配
private static void checkQQ(String str) {
String regex = "[1-9]\\d{4,14}";
boolean flag = str.matches(regex);
if (flag)
sop(str + "...isok");
else
sop(str + "...不合法");
}
}
正则表达式的练习:
package mypackage.regex;
import java.util.TreeSet;
public class RegexTest {
public static void main(String[] args) {
// test();
// test_1();
checkMail();
}
private static void checkMail() {
String mail = "676759829@qq.com";
String regex = "[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
System.out.println(mail.matches(regex));
}
private static void test_1() {
String ip = "192.68.1.254102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
ip = ip.replaceAll("(\\d+)", "00$1");
System.out.println(ip);
ip = ip.replaceAll("0*(\\d{3})", "$1");
System.out.println(ip);
String[] arr = ip.split(" +");
TreeSet<String> ts = new TreeSet<String>();
for (String s : arr) {
ts.add(s);
}
for (String s : ts) {
System.out.println(s.replaceAll("0*(\\d+)", "$1"));
}
}
private static void test() {
String str = "我我....我我...要要要....要要....学学学...学..学学...编编编...编..程程程...程程..";
str = str.replaceAll("\\.+", "");
System.out.println(str);
str = str.replaceAll("(.)\\1+", "$1");
System.out.println(str);
}
}
网页爬虫:
package mypackage.regex;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PagePaiChong {
public static void main(String[] args) throws Exception {
getMail();
}
private static void getMail() throws Exception {
URL url = new URL("http://www.baidu.com");
URLConnection conn = url.openConnection();
BufferedReader bufin = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String regex = "\\w+@(\\.\\w+)+";
Pattern p = Pattern.compile(regex);
Matcher m;
String line = null;
while ((line = bufin.readLine()) != null) {
m = p.matcher(line);
while (m.find()) {
System.out.println(m.group());
}
}
}
}