正则表达式

打印 上一主题 下一主题

主题 843|帖子 843|积分 2531

整理自B站  廖雪峰老师的正则表达式课程。
正则表达式的概述

什么是正则表达式?
正则表达式可以用字符串来描述规则,并用来匹配字符串。
正则表达式是字符串。
用字符描述规则,匹配字符。
用正则表达式的好处:
一个正则表达式就是一个描述规则的字符串。
只需要编写正确的规则,就可以让正则表达式引擎去判断目标字符串是否符合规则。
正则表达式是一套标准,可以用于任何语言。
jdk的内置正则表达式引擎:java.util.regex
匹配方向:
从左到右按规则匹配
匹配规则:
&:精确匹配:“a\&c” 精确匹配ac
用. 来匹配任意一个字符。 “a.c”   abc aac acc等
\d: 来匹配数字: “00\d”
\w :可以匹配一个字母,数字或下划线:“java\w”  不能匹配#和空格。
\s: 可以匹配一个空格字符。“a\sb”
\D:可以匹配任意一个非数字的符号(包括#)。”00\D”
\W: 非字母,数字下划线;“java\w” 可能是 java_
\S: 可以匹配一个非空白字符:”A\SB“ 可以是A&B ABB  不能是”A B“
*: 可以匹配任意0次或多次字符
+:可以匹配至少1字符。
?: 可以匹配零个或一个字符。“A?B” 可以是A和B的任意字符。
{n} : 表示匹配n个字符。”\d{6}” 匹配6个数字
{n,m}:表示匹配n到m个字符。“\d{3,5}”表示匹配3到5个数字
{n,}:至少n个字符。
复杂的匹配规则:
加上^(开头)和$(结尾)会变得严谨,java默认只能做单行匹配,可以不加。
[…]可以匹配范围内的字符:”[abc]1”  表示abc中的一个 a1 b1 c1;
[a-f]1 表出a到f中的一个和1结合;[a-f0-9_]{6} 下划线和字母数字间没有顺序
[^…]:匹配[…]内除外的所有字符
AB|CD: AB或CD
learn\s(AB|CD): learn (空格)AB或者learn (空格)CD
案例:匹配5到10位的qq号
  1. public static boolean isValidQQ(String s){
  2.         return s.matches("^[1-9]\\d{4,9}$");
  3.     }
复制代码
分组匹配规则
(…)可以用来分组:


String.matches  vs Pattern.mather
实际上是一样的,string的matches内部调用的就是pattern.mather
反复使用一个正则表达式进行快速匹配效率低下
可以把正则表达式字符串编译成pattern对象
  1. Pattern pattern = Pattern.compile("^\\d{3,4}\\-\\d{6,8}$");
  2. pattern.mather("010-12345678").matches(); //true
  3. //获取Match的对象:
  4. Matcher matcher = Pattern.matcher(String s);
  5. matcher.matches();  //true or false
复制代码
使用Matcher.group(n)快速提取子串
  1. String s = "010-123456";
  2.         Pattern pattern = Pattern.compile("^(0\\d{2,3})-([1-9]\\d{5,7})");
  3.         Matcher matcher = pattern.matcher(s);
  4.         if(matcher.matches()){
  5.                                                 String s0=matcher.group(0);  //表示获取全部字符。
  6.             String s1=matcher.group(1);
  7.             String s2=matcher.group(2);
  8.             System.out.println(s1);
  9.             System.out.println(s2);
  10.         }
复制代码
贪婪匹配和非贪婪匹配

正则表达式的贪婪匹配
默认是贪婪匹配,就是在匹配时尽可能多地向后匹配。

非贪婪匹配
  1. String s="9999";
  2.         Pattern pattern = Pattern.compile("^(\\d??)(9*)$");
  3.         Matcher m = pattern.matcher(s);
  4.        if(m.matches()){
  5.            String s1 = m.group(1);
  6.            String s2 = m.group(2);
  7.            System.out.println(s1);
  8.            System.out.println(s2);
  9.        }
复制代码
提取,搜索及替换

提取的例子
String[] String.split(String regex);
  1. String s = "a#b;;c,  1234;5;";
  2.         String[] str = s.split("[\\,\\#\\s+\\;]+");
  3.         for (String s1 : str) {
  4.             System.out.println(s1);
复制代码
搜索的例子
Matcher.find();
  1. public static void main(String[] args) {
  2.         String s = "the good things hello";
  3.         Pattern p = Pattern.compile("the",Pattern.CASE_INSENSITIVE);  //忽略大小写
  4. \\ \\w+ 提取每一个单词   \\w*o\\w* 带有o的单词
  5.         Matcher m = p.matcher(s);
  6.         while (m.find()){
  7.             String sub = s.substring(m.start(),m.end());
  8.             System.out.println(sub);
  9.         }
  10.     }
复制代码
替换
String.replaceAll();
  1. public static void main(String[] args) {
  2.         String s = "the   quick brown  fox  jumps over the  lazy dog.";
  3.         String s1 = s.replaceAll("\\s+", " ");
  4.         System.out.println(s1);
  5. //再将s1的内容加粗体处理
  6.                                 String s2 = s1.replaceAll("(\\w+)", "<b>$1</b>");
  7.         System.out.println(s2);
  8.     }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81428

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表