这不纯纯天书吗,谁要能学会正则,我真是表示羡慕
另外,此文章采用的纯纯 cv 大法, 到处粘贴,我是不喜欢学正则。。。反人类的语法
Regex 正则表达式
正则表达式(Regex)不仅仅是Java的技术,在任何一门编程语言中都会存在,是一种通用的IT技术,其理念和用法在任何编程语言中基本一致,除了有一些由于语言不同而导致的一些语法不同正则表达式,主要用于匹配(查找 替换 计数)字符串中的数据的,也叫做文本匹配技术。
以下是正则表达式的特点:
- 灵活性:正则表达式可以匹配各种不同格式的文本,包括数字、字母、符号、空白字符等。
- 精确性:正则表达式可以精准地匹配指定的文本模式,避免匹配错误或过度匹配。
- 强大性:正则表达式支持多种操作,如查找、替换、分割等,可以在多种应用场景中使用。
- 学习成本高:正则表达式的语法相对复杂,需要花费时间学习和理解。
正则表达式的匹配规则
正则表达式(Regex)的匹配规则基于一些特定的语法和符号,可以帮助我们更方便地匹配和查找文本数据。以下是正则表达式的匹配规则
- 字符类:使用方括号([])表示,用来匹配指定字符集中的任意一个字符。例如,[abc]可以匹配a、b、c中的任意一个字符。
- 量词:用来指定匹配字符的数量,包括:*(匹配0次或多次)、+(匹配1次或多次)、?(匹配0次或1次)、{n}(匹配n次)、{n,}(匹配n次或多次)和{n,m}(匹配n到m次)。
- 边界匹配符:用来匹配字符串的边界。包括:^(匹配字符串开头)、$(匹配字符串结尾)和\b(匹配单词边界)。
- 分组:使用圆括号()表示,用来将多个字符作为一个整体来匹配。
- 转义字符:使用反斜杠\表示,用来转义具有特殊含义的字符,例如+匹配+字符。
- 模式修饰符:在正则表达式后面添加特定符号,用来修改匹配规则,例如i(忽略大小写)、g(全局匹配)和m(多行匹配)。
以上是正则表达式的基本匹配规则,使用这些规则可以构建复杂的字符串模式来匹配、搜索、替换和验证文本数据。
正则表达式
匹配任意字符
这个我还是会滴! . 可以匹配任意一个字符, 基于 a.b, 例如 aab, a&b 都可以匹配且返回为true
但是他不能匹配 ab, abc, . 匹配一个字符且仅限一个字符
String regex = "a.b"; System.out.println("abc".matches(regex));//false System.out.println("a&b".matches(regex));//true System.out.println("acb".matches(regex));//true System.out.println("ab".matches(regex));//false System.out.println("a&&b".matches(regex));//false
匹配数字
如果我们只想匹配 0 ~ 9 这样的数字,可以用 \d 匹配
String regex = "Demo\\d\\d\\.java"; System.out.println("Demo11.java".matches(regex));//true System.out.println("Demo123.java".matches(regex));//false System.out.println("Demo.java".matches(regex));//false
匹配常用字符
用 \w 可以匹配一个字母、数字或下划线,w的意思是word。
它不能匹配 “java#” , "java " ,因为 \w 不能匹配 # 、空格等字符
String regex = "java\\w"; System.out.println("java_".matches(regex));//true System.out.println("javac".matches(regex));//true System.out.println("java".matches(regex));//false System.out.println("java!".matches(regex));//false
匹配空格字符
用 \s 可以匹配一个空格字符,注意空格字符不但包括空格 " “`,还包括tab字符(在Java中用制表符”\t"表示)。
String regex = "a\\sc"; System.out.println("a c".matches(regex));//true System.out.println("a c".matches(regex));//false System.out.println("ac".matches(regex));//false System.out.println("a c".matches(regex));//false System.out.println("a\tc".matches(regex));//true
匹配非数字
\d 可以匹配 0-9 的数字, 则\D可以匹配非数字
例如, 00\D 可以匹配:
- “00A” ,因为 \D 可以匹配非数字字符 A ;
- “00#” ,因为 \D 可以匹配非数字字符 # 。
00\d 可以匹配的字符串 “007” , “008” 等, 00\D 是不能匹配的。
类似的:
- \d任意一个数字 \D任意一个非数字;
- \s任意一个空格 \S任意一个非空格;
- \w任意一个数字字母下划线 \W任意一个非数字字母下划线
重复匹配
我们用 \d 可以匹配一个数字,例如, A\d 可以匹配 “A0” , “A1” ,如果要匹配多个数字,比如 “A380” ,怎么办?
修饰符 * 可以匹配任意个字符,包括0个字符。我们用 A\d* 可以匹配:
A :因为 \d* 可以匹配0个数字;
A0 :因为 \d* 可以匹配1个数字 0 ;
A380 :因为 \d* 可以匹配多个数字 380 。
String regex1 = "A*"; //连续0个或多个A System.out.println("A".matches(regex1)); System.out.println("Animal".matches(regex1)); System.out.println("A123123".matches(regex1)); System.out.println("AAAAAAA".matches(regex1)); String regex2 = "A\\d*"; System.out.println("A12313123123".matches(regex2)); System.out.println("A".matches(regex2)); System.out.println("Aasdhjahsjdk1123".matches(regex2)); System.out.println("".matches(regex2));
修饰符 + 可以匹配至少一个字符。我们用 A\d+ 可以匹配:
A0 :因为 \d+ 可以匹配1个数字 0 ;
A380 :因为 \d+ 可以匹配多个数字 380 。
但它无法匹配 “A” ,因为修饰符 + 要求至少一个字符。
String regex = "A\\d+"; System.out.println("A12313123123".matches(regex)); System.out.println("A".matches(regex)); // false System.out.println("Aasdhjahsjdk1123".matches(regex)); System.out.println("".matches(regex));
修饰符 ? 可以匹配0个或一个字符。我们用 A\d? 可以匹配:
A :因为 \d? 可以匹配0个数字;
A0 :因为 \d+ 可以匹配1个数字 0 。
但它无法匹配 “A33” ,因为修饰符 ? 超过1个字符就不能匹配了。
String regex = "A\\d?"; System.out.println("A12313123123".matches(regex)); System.out.println("A".matches(regex)); System.out.println("A1".matches(regex)); System.out.println("".matches(regex));
如果我们想精确指定n个字符怎么办?用修饰符 {n} 就可以。 A\d{3} 可以精确匹配:
A380 :因为 \d{3} 可以匹配3个数字 380 。
如果我们想指定匹配n~m个字符怎么办?用修饰符 {n,m} 就可以。 A\d{3,5} 可以精确匹配:
A380 :因为 \d{3,5} 可以匹配3个数字 380 ;
A3800 :因为 \d{3,5} 可以匹配4个数字 3800 ;
A38000 :因为 \d{3,5} 可以匹配5个数字 38000 。
如果没有上限,那么修饰符 {n,} 就可以匹配至少n个字符。
System.out.println("A123".matches("A\\d{3}")); System.out.println("A123".matches("A\\d{3,5}")); System.out.println("A12345".matches("A\\d{3,5}")); System.out.println("A123".matches("A\\d{4,}"));
比如匹配一个座机号 010-33167854 3个数字-8个数字 \d{3}-\d{8}。
System.out.println("010-12345678".matches("\\d{3}\\-\\d{8}")); System.out.println("0101-2345678".matches("\\d{3}\\-\\d{8}"));
正则表达式字符含义
正则表达式 规则 可以匹配 A 固定字符A "A" \u548c 指定Unicode字符 "和" . 任意一个字符 "a" "1" " " \d 一个数字字符0~9 "0"~"9" \w 一个数字或字母或下划线 \W 非\w \D 非\d \s 一个空格字符(\t ' ') \S 非\s A* A有任意个 "" "A" "AA" "AAA" A+ A至少一个 "A" "AA" "AAA" A? A0个或1个 "" "A" A{3} A出现3次 "AAA" A{3,5} A出现3~5次 "AAA" "AAAA" "AAAAA" A{2,} A出现至少2次 "AA" "AAA" "AAAA" A{0,3} A出现0~3次 "" "A" "AA" "AAA"
一些常用到的正则
匹配整数
String regex = "^\\d+$"; String num = "12345"; boolean isMatched = num.matches(regex); System.out.println(isMatched); // true
匹配浮点数
String regex = "^\\d+(\\.\\d+)?$"; String num = "3.14"; boolean isMatched = num.matches(regex); System.out.println(isMatched); // true
匹配汉字
String regex = "^[\\u4e00-\\u9fa5]+$"; String chinese = "中国"; boolean isMatched = chinese.matches(regex); System.out.println(isMatched); // true
匹配日期格式(yyyy-MM-dd)
String regex = "^\\d{4}-\\d{2}-\\d{2}$"; String date = "2023-05-14"; boolean isMatched = date.matches(regex); System.out.println(isMatched); // true
匹配邮政编码
String regex = "^\\d{6}$"; String postalCode = "100101"; boolean isMatched = postalCode.matches(regex); System.out.println(isMatched); // true
匹配手机号码
String regex = "^1[3456789]\\d{9}$"; String phoneNumber = "13612345678"; boolean isMatched = phoneNumber.matches(regex); System.out.println(isMatched); // true
匹配电子邮件地址
String regex = "^\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"; String email = "example@example.com"; boolean isMatched = email.matches(regex); System.out.println(isMatched); // true
匹配URL地址
String regex = "^((https?|ftp|file)://)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*/?$"; String url = "http://www.example.com/index.html"; boolean isMatched = url.matches(regex); System.out.println(isMatched); // true