java正则表达式
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class test1{
public static void main(String args[]){
String content="";
Strign regexp="\\d\\d\\d";
Pattern pattern = Pattern.compile(regex);
Matcher matcher=pattern.matcher(content);
while(matcher.find()){
System.out.println(matcher.group(0));
}
}
}
正则表达式中关于groups的说法:
注意事项:
- 如果正则表达式有()即分组
- 取出匹配的字符串规则如下
- group(0) 表示匹配到的子字符串
- group(1) 表示匹配到的子字符串的第一组字串
- group(2) 表示匹配到的子字符串的第二组子串
- 但是分组的数,不能越界
1. 正则表达式语法
1.1 转义号 \
- 在java中两个\代表其他语言中的一个\
- 需要用到转义符号的字符
- * + ( ) $ \ / ? [ ] ^ { }
1.2 字符匹配符
- [ ] : 可以接受的字符列表
- [^ ] : 不接受的字符列表(除了列表中字符以外的任意一个字符)
- - : 连字符 比如[A-Z] 任意单个大写字母
- . : 匹配除了 \n以外的任意字符
- \d : 匹配单个数字字符 相当于[0-9]
- \D : 匹配单个非数字字符 相当于[^0-9]
- \w : 匹配单个数字,大小写字母字符 \d{3}\w{4} 表示以三个数字字符开头的长度为7的字符串
- \W : 相当于[^0-9a-zA-Z]
- \s : 匹配任何空白字符
- \S : 匹配任何非空白字符
1.3 小细节
- 不区分大小写, (?i)abc 表示 abc不区分大小写 a((?i)b)c 表示只有b不区分大小写
- [a-z]{6} 表示匹配连续6个都是小写字母的字符串
1.4 选择匹配符
1.5 正则限定符
- * : 表示指定字符重复0或者n次 (0-n)
- +: 指定字符重复1次或者n次 (1-n)
- ? : 指定字符重复0次或者1次 (0 | 1)
- {n} : 只能输入n个字符 (n)
- {n,} : 指定至少n个匹配
- {n,m}: 指定至少n个,但是不多于m个匹配
1.6 正则定位符
- ^ : 指定起始字符
- ^//d+[a-z]* 以1-n个数字开头,后面跟0-n个小写字母
- $ : 指定结尾字符
- \b 匹配目标字符串的边界(最后或者是空格的子字符串后面)
- \B 匹配目标字符串的非边界 (与\b正好相反)
1.7 有关匹配的分组
1.8 非捕获分组
String regexp="56(?:8|89)"
"56(?=8|89)"
"56(?!8|89)"
2. 正则表达式中的一些潜规则
2.1 贪心与非贪心
- 所谓贪心: 即有多个匹配条件的时候,匹配字符串更长的字符串 (正则表达式的默认)
- 非贪心: ? 加在 限定符后面,表示非贪心,尽量匹配字符串更短的
2.2 关于Pattern类
Pattern的matches 是进行整体匹配的, 一旦不整体匹配则返回false
System.out.println(Pattern.matches(reg.Str,content));
2.3 关于Matcher类
整体匹配:
matcher.matches()
关于replace(返回替换后的字符串)
String newContent=matchaer.replaceAll(”要替换的字符”);
2.4 关于反向引用(******)(算法杀器)
圆括号的内容被捕获之后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个被我们称为反向引用
- 内部反向引用为: \分组号
- 外部反向引用: $分组号
3. 正则表达式实际应用
-
验证是否是汉字 “^ [\u0391-\uffe5]$” -
验证邮政编码(1-9开头的6位数) “^ [1-9]\d{5}$” -
验证是否是QQ号(1-9开头的 (5位数-10位数)): “^ [1-9]\d{4,9}$” -
验证是否是手机号码(必须是13,14,15,18开头的11位数字):
-
验证电子邮件是否合法
- 只能有一个@
- @前面是用户名,可以是a-zA-Z0-9_-字符
- @后面是域名,只能应为 sodu.com
- 写出对应的正则表达式
- “^[\w_-]+@[a-zA-Z]+(\.[a-zA-Z]+)*$”
-
验证一个数是不是整数或者小数 public class test04 {
public static void main(String[] args) {
String content="-345.151";
String regex1="^[+-]?[1-9]\\d*$";
String regex2="^[+-]?\\d+\\.\\d+";
String regex3="^[+-]?([1-9]\\d*|0)(\\.\\d+)?$";
if(Pattern.compile(regex1).matcher(content).find()) System.out.println("是整数");
if(Pattern.compile(regex2).matcher(content).find()) System.out.println("是小数");
if(Pattern.compile(regex3).matcher(content).find()) System.out.println("是整数或者小数");
}
}
-
对一个url进行解析
- 要求得到的协议
- 要求得到的域名
- 要求得到的端口
- 要求得到的文件名
public class test05 {
public static void main(String[] args) {
String content="https://www.baidu.com:8080/abc/index.html";
String protocol="^([a-zA-Z]+)://";
String domain="://([a-zA-Z.]+):";
String port=":(\\d+)/";
String file="/([a-zA-Z]+\\.[a-zA-Z]+)$";
Pattern pattern=Pattern.compile(protocol);
Matcher matcher=pattern.matcher(content);
while(matcher.find()){
System.out.println("协议名字为:"+matcher.group(1));
}
pattern=Pattern.compile(domain);
matcher=pattern.matcher(content);
while(matcher.find()){
System.out.println("域名名字为:"+matcher.group(1));
}
pattern=Pattern.compile(port);
matcher=pattern.matcher(content);
while(matcher.find()){
System.out.println("端口名字为:"+matcher.group(1));
}
pattern=Pattern.compile(file);
matcher=pattern.matcher(content);
while(matcher.find()){
System.out.println("文件名字为:"+matcher.group(1));
}
}
}
3.1正则支持字符串替换
String.replaceAll(regex,NEWsTRING)
3.2正则支持字符串分割
content= "hello#agjniaosg jack!asjfiaso~agk"
String[] split=content.split("#|!| |~|\\d+")
for(String ss:split){
System.out.println(ss)
}
|