------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
正则表达式
概念:符合一定规则的表达式
作用:专门用于操作字符串;
特点:用于一些特定的符号来表示一些代码操作,这样就简化了书写;
好处:可以简化对字符串的复杂操作;
弊端:规则字符定义的越多,越不便阅读,造成阅读性差;
常见的符号:
字符类 | |
---|---|
[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} | X,至少 n 次,但是不超过 m 次 |
字符类可以出现在其他字符类中,并且可以包含并集运算符(隐式)和交集运算符 (&&)。并集运算符表示至少包含其某个操作数类中所有字符的类。交集运算符表示包含同时位于其两个操作数类中所有字符的类。
1 字面值转义 \x 2 分组 [...] 3 范围 a-z 4 并集 [a-e][i-u] 5 交集 [a-z&&[aeiou]]
注意,元字符的不同集合实际上位于字符类的内部,而非字符类的外部。例如,正则表达式 . 在字符类内部就失去了其特殊意义,而表达式 - 变成了形成元字符的范围。
具体操作功能:
①匹配:String matches()方法;用规则匹配整个字符串,只要有一处不符合规则,则返回false
public class Test1{
public static void main(String[] args) {
String qq="2343434";
String regex = "[1-9][0-9]{4,14}";
boolean flag = qq.matches(regex);
if(flag)
System.out.println("qq号码格式正确");
else
System.out.println("qq号码格式不正确");
}
}
②切割:String split(String regex)方法;根据给定正则表达式的匹配拆分此字符串
public class Test2{
public static void main(String[] args) {
/*
按照叠词进行切割,为了可以让规则的结果被重用,可以将规则用()封装成一个组,组都是
有编号的,从1开始; 想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取
*/
//通过叠词进行切割
split("sdssssfddfgggdd", "(.)\\1");
//通过点"."进行切割
split("aaa.sss.sfsss", "\\.");
//通过空格" "进行切割
split("asas asas asa", " +");
}
public static void split(String str, String regex){
String [] arr = str.split(regex);
System.out.println(arr.length);
for(String s : arr){
System.out.println(s);
}
}
}
③替换:String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
public class Test {
public static void main(String[] args) {
String str = "sfsdfdddvdvfsaaavxcvddd";
String regex = "(.)\\1+"; // (.)任何字符出现一次或多次
// String newStr1 = "\\$";//将叠词替换成$
String newStr2 = "$1";// 将叠词替换为它本身单个字符
str = str.replaceAll(regex, newStr2);
System.out.println(str);
}
④获取:Pattern p = Pattern.compile(reg); Matcher m = p.matcher(str);
/*
4,获取:将字符串中的符合规则的子串取出。
操作步骤:
1,将正则表达式封装成对象。
2,让正则对象和要操作的字符串相关联。
3,关联后,获取正则匹配引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。
*/
import java.util.regex.*;
class Test {
public static void main(String[] args) {
getDemo();
}
public static void getDemo() {
String str = "jin tian wo yao qu duan lian。";
System.out.println(str);
String reg = "\\b[a-z]{4}\\b"; //匹配四个字母的单词
// 将规则封装成对象。
Pattern p = Pattern.compile(reg);
// 让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);
// System.out.println(m.matches());//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
// 只不过被String的方法封装后,用起来较为简单。但是功能却单一。
//m.find()将规则作用到字符串上,并进行符合规则的子串查找。
while (m.find()) {
//用于获取匹配后结果。
System.out.println(m.group());
System.out.println(m.start() + "...." + m.end());
}
}
}
// 演示 网络爬虫
/*是一段小程序,专门负责获取指定规则的数据。
需求: 获取指定文件的特定信息,比如邮箱地址
1 读取文件
2 获取文件中的每一行字符串
3 对该行字符串中的特定信息进行规则的匹配,将符合规则都获取出来,并进行存。
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class NetBug {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
readMail();
}
public static void readMail() throws IOException {
URL url = new URL("http://192.168.1.20:8080/index.jsp");// 爬服务器的邮箱
URLConnection conn = url.openConnection();
BufferedReader bufIn = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
// 如果不需要操作消息头,,不需要获取openConnection(); url.openStream();
// BufferedReader bufr = new BufferedReader(new
// FileReader("c:\\mail.htm"));
String line = null;
// 定义规则。mail规则。
String reg = "[a-zA-Z0-9_]+@\\w+(\\.\\w+)+";
Pattern p = Pattern.compile(reg);
while ((line = bufIn.readLine()) != null) {// 匹配器通过流读的
Matcher m = p.matcher(line);
while (m.find()) {
System.out.println(m.group());// 不应该打印,存到集合里,在存到数据库
}
}
bufIn.close();
}
}
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------