——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
正则表达式:符合一定规则的表达式
作用:用于操作字符串
特点:用一些特定的符号来表示一些代码数据,简化书写
缺点:复杂的正则表达式阅读行极差
基本功能:
1、匹配:s.matches(regex)
2、切割:s.split(regex);
重点:如何切割 . 和 \ (反斜杠)
根据叠词切割:”abcddiujffmnpoijjsdf”
3、替换:s.replaceAll(regex,newString)
重点:”$1”获取上一个字符串中第一组的内容
4、获取:将字符串中符合的子串取出
获取步骤:
String regex =”正则表达式…”;
1、把正则表达式封装成对象
Pattern p = Pattern.compile(regex)
2、正则对象和要操作的字符串相关联
3、关联后,获取正则匹配引擎
Matcher m = p.matcher(s)
4、通过引擎对符合规则的子串进行取出
while (m.find()) {// 类似iterator,匹配则返回数据
//必须要先调用find(),否则报错
System.out.println(m.group());
}
书写规范
例:[][][]有几个中括号代表匹配几个字符(匹配3个字符)
[abc] 这个字符上只能是a、b、c中的一个
[^abc] 这个字符匹配出了abc之外的所有字符
[a-zA-Z0-9]这个字符匹配a-zA-Z0-9的字符
[a-d[m-p]]这个字符匹配a-d或者m-p
[a-z&&[def]]这个字符匹配a-z和def的交集:就是def
[a-z&&[^dc]]这个字符匹配a-z和除了dc的字符
[a-z&&[^m-p]]这个字符匹配a-z和除了m-p的字符:就是a-l和q-z
预定义字符
. 代表任意字符:在字符串中表示无意义的点 . 要:\. 来表示一个无意义的点
\d:数字[0-9]
\D:非数字[^0-9]
\s:空白字符
\S:非空白字符
\w:单词字符[a-zA-Z0-9_]又包含下划线,没有$符号
\W:非单词字符
\b:单词边界符,例如空格
\B:非单词边界
^:行开头
$:行结尾
次数代表
\d?:后面的字符跟\d条件匹配,并且后面的字符可以出现0次或1次
\d*:后面的字符跟\d条件匹配,并且后面的字符可以出现0次或多次(最多不限)
\d+:后面的字符跟\d条件匹配,并且后面的字符可以出现1次或多次(最少一次)
\d{n}:后面的字符跟\d条件匹配,并且后面的字符刚好出现n次
\d{n,}:后面的字符跟\d条件匹配,并且后面的字符最少出现n次,最多不限
\d{n,m}:后面的字符跟\d条件匹配,并且后面的字符最少出现n次,最多m次
字符串的所有正则方法都可以使用patten获取正则表达式对象
然后关联字符串,通过matcher来调用相关方法
String类中的matches()split()和relaceAll()底层都是调用patten和matcher来实现
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo {
public static void main(String[] args) {
"// matches();// 字符串匹配"
"// split();// 字符串切割"
"// replace();// 替换"
"// get();// 获取子串"
netMethos();"// 网络爬虫"
}
"/**
* 字符串匹配
* 匹配是匹配整个字符串,当有一个字符不符合规则就立即结束,并返回false
*/"
public static void matches() {
"// 手机号码,13...,15...,18...,长度为11位,全部是数字"
String phone = "1334567a910";
String phoneRegex = "1[358]\\d{9}";
"// qq号码,不能0开头,不能有字母,长度5-15之间"
String qq = "124633354";
String qqRegex = "[1-9]\\d{4,14}";
boolean b = phone.matches(phoneRegex);
boolean c = qq.matches(qqRegex);
System.out.println(b);
System.out.println(c);
}
"/**
* 字符串切割
* 切割匹配的是要切割的字符,也就是要匹配切割的条件
* 当一个字符不满足切割条件时会继续对下一个字符进行判断,直到字符串结束
*
* 叠词切割
* (.)\\1+ :():括号内是匹配的字符,并封装成一个组,自动有编号从1开始
* \\1是对第一组的 内容 进行重用 ,**是匹配后的内容**
* +:这个内容出现一次或多次
* (a(b(c))(d)):有几个组,看左边括号 组的编号,看左边括号
*/"
public static void split() {
"// 叠词切割"
String s = "好ww好学rrrr习,天fffff天ff向dddd上";
String regex = "(.)\\1+";
method(s, regex);
"// 切割点 ."
String s1 = "好..好学.....习,天...天....向...上";
String regex1 = "\\.";
method(s1, regex1);
"// 切割路径"
String s2 = "c://demo//demo.txt";
String regex2 = "\\/\\/";
method(s2, regex2);
}
public static void method(String s, String regex) {
String[] end = s.split(regex);
for (String t : end) {
System.out.print(t + " ");
}
}
"/**
* 替换
* c.replaceAll(regex1, "$1");
* $1,是使用上一个字符串的中 组1 的内容
* 两个字符串要在一个括号内才能使用$
*/"
public static void replace() {
String s = "我我我..我我我......要要要要要..要要要..编编编编编编编编编...编编....程程程程程程程程";
String regex = "\\.";
String c = s.replaceAll(regex, "");
System.out.println(c);
String regex1 = "(.)\\1+";
String d = c.replaceAll(regex1, "$1");
System.out.println(d);
}
"/**
* 获取匹配的子串
*/"
public static void get() {
String s = "11112312ssssspodtdfffoooo";
String regex = "(.)\\1{2,}";
Pattern p = Pattern.compile(regex);"// 封装正则表达式为对象"
Matcher m = p.matcher(s);"// 关联字符串并返回匹配引擎,操作引擎来获取数据"
while (m.find()) {"// 类似iterator,匹配则返回数据"
System.out.println(m.group());
}
}
"/**
* 网页爬虫
*
* "\\w{5,15}@\\w+(\\.[a-zA-z]{2,3})+"
* \\w{5,15}单词最少出现5次,最多15次
* @
* \\w+ 出现一次或多次
* (\\.[a-zA-z]{2,3})+
* 对组进行重用
*/"
public static void netMethos() {
try {
String regex = "\\w{5,15}@\\w+(\\.[a-zA-z]{2,3})+";
Pattern p = Pattern.compile(regex);
URL url = new URL("http://127.0.0.1:8080/demo.txt");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.connect();
BufferedReader br = new BufferedReader(new InputStreamReader(
conn.getInputStream(), "UTF-8"));
String line = null;
while ((line = br.readLine()) != null) {
Matcher m = p.matcher(line);"// 字符串与正则表达式进行绑定"
while (m.find()) {"// 遍历输出"
System.out.println(m.group());
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-