正则表达式学习笔记
一、常用正则表达式
1、匹配字母 Pattern pattern=Pattern.compile("[a-zA-Z]+");
2、匹配数字 Pattern pattern=Pattern.compile("[0-9]+");
3、匹配字母和数字 Pattern pattern=Pattern.compile("([0-9]+)|([a-zA-Z]+)");
4、匹配百度排行榜 Pattern pattern=Pattern.compile("<a target=\"_blank\" title=\"(\\S*)\"");
5、匹配IP地址:Pattern pattern=Pattern.compile("\\d+\\.\\d+\\.\\d+\\.\\d+");
6、匹配4位数字:Pattern pattern=Pattern.compile("\\d\\d\\d\\d");
7、匹配
二、需要转义的字符
.*+()$/\?[]^{}
字符 | 说明 |
---|---|
\ | 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。 例如:“n"匹配字符串"n”。“\n"匹配换行符。序列”\\“匹配”\“,”\(“匹配”("。 |
^ | 匹配输入字符串开始的位置。 如果设置了RegExp对象的Multiline属性,^还会与"\n"或"\r"之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。 如果设置了RegExp对象的Multiline属性,$还会与"\n"或"\r"之前的位置匹配。 |
? | 当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。 “非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。 例如:在字符串“oooo”中,"o+?“只匹配单个"o”,而"o+“匹配所有"o”。 |
三、元字符
符号 | 含义 | 示例 | 说明 | 匹配输入 |
---|---|---|---|---|
[] | 可接收的字符列表 | [efgh] | e、f、g、h中的任意1个字符 | |
[^] | 不可接收的字符列表 | [^abc] | 除a、b、c之外的任意1个字符,包括数字和特殊符号 | |
- | 连字符 | A-Z | 任意单个大写字母 | |
. | 匹配除\n以外的任何字符 | a…b | 以a开头,b结尾,中间包括2个任意字符的长度为4的字符串 | aaab、aefb、a35b、a#*b |
\d | 匹配单个数字字符,相当于[0-9] | \\d{3}(\\d)? | 包含3个或4个数字的字符串 | 123、9876 |
\D | 匹配单个非数字字符串,相当于[^0-9] | \\d(\\d)* | 以单个非数字字符串开头,后接任意个数字字符串 | a、A342 |
\w | 匹配单个数字、大小写字母字符,相当于[0-9a-zA-Z_] | \\d{3}\\w{4} | 以3个数字字符串开头的长度为7的数字字母字符串 | 234abcd、12345Pe |
\W | 匹配单个非数字、大小写字符,相当于[^0-9a-zA-Z_] | \\W+\\d{2} | 以至少1个非数字字母字符开头,2个数字字符结尾的字符串 | #29、#?@10 |
(?i) | 不区分大小写 | (?i)abc、a(?i)bc、a((?i)b)c | 1、abc都不区分大小写;2、bc不区分大小写;3、仅b不区分大小写 | |
\\s | 匹配任何空白字符(空格,制表符等) | |||
\\S | 匹配任何非空白字符(空格,制表符等) | |||
竖杠 | 匹配竖杠之前或之后的表达式 |
四、限定符
五、Java调用代码
逐个匹配(注意定位符)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String content=".......";
Pattern pattern=Pattern.compile("\\d+\\.\\d+\\.\\d+\\.\\d+");
//Pattern pattern=Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);// 不区分大小写
Matcher matcher = pattern.matcher(content); // 逐个匹配
while(matcher.find()) {
System.out.println("--> "+matcher.group(0));
}
}
整体匹配(推荐使用)
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String content=".......";
String pattern=".*hao.*";
boolean isMatch=Pattern.matches(pattern,content);// 整体匹配
System.out.println(isMatch);
}
常用其他方法
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
String content=".......";
Pattern pattern=Pattern.compile("hao123");
Matcher matcher = pattern.matcher(content);
String newStr=matcher.replaceAll("好的");// 匹配后替换(注意:原字符串保持不变)
}
六、分组
1、捕获分组
常用分组构造形式 | 说明 |
---|---|
(pattern) | 非命名捕获。 捕获匹配的字符串。 编号为零的第一个捕获是由整个正则表达式模式匹配的文本, 其他捕获结果则根据左括号的顺序从1开始自动编号。 |
(?<name>pattern) | 命名捕获。 |
举例:
String regStr="(?<g1>\\d\\d)(?<g2>\\d\\d)";
matcher.group(0); // 找到的整体数据
matcher.group(1);// 找到的第一个分组内容
matcher.group(“g1”);// 找到的分组名称为g1的内容;
2、非捕获分组(特别分组)
常用分组构造形式 | 说明 |
---|---|
(?:pattern) | 匹配pattern但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。 这对于用“or”字符(|)组合模式部件的情况很有用。 例如:'industr(?:y|ies)'是比’industry|industries’更经济的表达式。 |
(?=pattern) | 它是一个非捕获匹配。 例如:'Windows(?=95|98|NT|2000)'匹配’Windows 2000’中的"Windows",但不匹配"Windows 3.1"中的"Windows"。 |
(?!pattern) | 该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串。 它是一个非捕获匹配。 例如:'Windows(?!95|98|NT|2000)'匹配"Windows 3.1"中的"Windows",但不匹配"Windows 2000"中的"Windows"。 |
3、反向引用
说明:内部反向引用:\\分组号
,外部反向引用 $分组号
。
- 匹配两个连续的相同数字:
(\\d)\\1
- 匹配五个连续相同的数字:
(\\d)\\1{4}
- 匹配个位与千位相同,十位与百位相同的数字,比如:5225,1551 正则:
(\\d)(\\d)\\2\\1
- 匹配商品编号,形式如:12312-333-999-111,格式描述:5位数字开头,然后一个-,然后一个9位数,连续的每3位相同。正则:
\\d{5}-(\\d)\\1{2}(\\d)\\2{2}(\\d)\\3{2}
应用:将结巴的字去除掉。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegTest {
public static void main(String[] args) {
String regStr="我我要吃吃吃吃饭饭";
Pattern compile = Pattern.compile("(.)\\1+");
Matcher matcher = compile.matcher(regStr);
String str = matcher.replaceAll("$1");
System.out.println(str);
// 简写
String str=Pattern.compile("(.)\\1+").matcher(regStr).replaceAll("$1");
}
}
结果:
我要吃饭
4、java String类中使用正则表达式
举例:
1、替换:要求使用正则表达式,将JDK1.3 和 JDK1.4 替换成 JDK
content=content.replaceAll("JDK1\\.3|JDK1\\.4","JDK");
2、验证:手机号,必须是:138 139 开头
String content="13688888888";
if(content.matches("1(38|39)\\d{8}")){
System.out.println("ok");
}
3、分割:要求按照 # 或 - 或 ~ 或 数字 来分割
String content="hello#abc-jack12smith~北京";
String[] split=content.spllit("#|-|~|\\d+");
七、补充字符(不常用字符)
字符 | 说明 |
---|---|
\b | 匹配一个字边界,即字与空格间的位置。 例如:"er\b"匹配“never”中的er,但不匹配“verb”中的“er”。 |
\B | 非边界匹配。 例如: “er\B"匹配"verb"中的"er”,但不匹配"never"中的"er"。 |
\cx | 匹配x指示的控制字符。 例如:\cM 匹配Control-M或回车符。x的值必须在A-Z或a-z之间。如果不是这样,则假定c就是“c”字符本身。 |
\f | 换页符匹配。等效于\x0c 和\cL。 |
\n | 换行符匹配。等效于 \X0a 和\cJ。 |
\r | 匹配一个回车符。等效于 \X0d 和 \cM。 |
\t | 制表符匹配。 与 \x09 和 \cl等效。 |
\v | 垂直制表符匹配。与\x0b 和 \cK等效。 |
\xn | 匹配n,此处的n是一个十六进制转移码。十六进制转移码必须正好是两位数长。 例如:“\x41"匹配"A”。“\x041"与”\x04"&"1"等效。允许在正则表达式中使用ASCII代码。 |
\num | 匹配num,此处的num是一个正整数。到捕获匹配的反向引用。 例如:"(.)\1"匹配两个连续的相同字符。 |
\n | 标识一个八进制转移码或反向引用。 如果\n前面至少有n个捕获子表达式,那么n是反向引用。否则,如果n是八进制(0-7),那么n是八进制转移码。 |
\nm | 标识一个八进制转移码或反向引用。 如果\nm前面至少有nm个捕获子表达式,那么nm是反向引用。 如果\nm前面至少有n个捕获,则n是反向引用,后面跟有字符串m。 如果两种前面的情况都不存在,则\nm匹配八进制nm,其中n和m是八进制数字(0-7)。 |
\nml | 当n是八进制数(0-3),m和l是八进制数(0-7)时,匹配八进制转移码nml。 |
\un | 匹配n,其中n是以四位16进制表示的Unicode字符。例如:\u00A9 匹配版权符号。 |
八、常用正则表达式
- 字符串是否全部是汉子: regStr=“^[\u0391-\uffe5]+$”
- 邮政编码(1-9开头的一个6位数字):regStr=“^[1-9]\\d{5}$”
- QQ号码(1-9开头的一个(5位数-10位数)):regStr=“^[1-9\\d{4,9}]$”
- 手机号码(13,14,15,18 开头的11位数):regStr=“^1[3|4|5|8]\\d{9}$”;
- URL:
regStr="^((http|https)://)?([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.#]*)?$";
- 电子邮件(只有一个@,@前可以是a-z A-Z 0-9 _-字符,@后面是域名,比如 sohu.com或hao.org.cn)正则:
^[\\w_-]+@([a-zA-Z.]+)[a-zA-Z]+$
- 数字(包括 +123 -345 34.8 0.9等格式):
^[-+]?([1-9]\\d*|0)(\\.\\d+)?$
== 注意:==[. ? * ] 表示匹配就是. 本身;
九、附录(摘录课件)
正则表达式大全
校验数字的表达式:
1、数字:^[0-9]*$
2、n位的数字:^\d{n}$
3、至少n位的数字:^\d{n,}$
4、m-n位的数字:^\d{m,n}$
5、零和非零开头的数字:^(0|[1-9][0-9]*)$
6、非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9{1,2}])?$
7、带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$
8、正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
9、有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
10、有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
校验字符的表达式:
特殊要求:
文章来源:https://www.toymoban.com/news/detail-674508.html
十、完结
…文章来源地址https://www.toymoban.com/news/detail-674508.html
到了这里,关于正则表达式学习笔记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!