Java正则表达式介绍和使用规则(Pattern类Matcher类PatternSyntaxException类)

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java正则表达式介绍和使用规则(Pattern类Matcher类PatternSyntaxException类)相关的知识,希望对你有一定的参考价值。

文章目录

1. Java正则表达式机制说明(入门案例)

Java对正则表达式的支持是从1.4版本开始的,此前的JRE(Java RuntimeEnvironment, Java运行环境)版本不支持正则表达式。

入门实例:

假设现在有这么一段文本:

 String content = "万维网WWW(World Wide Web)发源于欧洲日内瓦量子物理实验室CERN,正是WWW技术的出现使得因特网得以超乎想象的速度迅猛发展。这项基于TCP/IP的技术在短短的10年时间内迅速成为已经发展了几十年的Internet上的规模最大的信息系统,它的成功归结于它的简单、实用。在WWW的背后有一系列的协议和标准支持它完成如此宏大的工作,这就是Web协议族,其中就包括HTTP超文本传输协议。\\n" +
                "在1990年,HTTP就成为WWW的支撑协议。当时由其创始人WWW之父蒂姆·伯纳斯·李(Tim Berners-Lee)提出,随后WWW联盟(WWW Consortium)成立,组织了IETF(Internet Engineering Task Force)小组进一步完善和发布HTTP。  \\n" +
                "HTTP是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一运行在用户空间的应用程序来实现其功能。HTTP是一种协议规范,这种规范记录在文档上,为真正通过HTTP进行通信的HTTP的实现程序。\\n" +
                "HTTP是基于B/S架构进行通信的,而HTTP的服务器端实现程序有httpd、nginx等,其客户端的实现程序主要是Web浏览器,例如Firefox、Internet Explorer、Google Chrome、Safari、Opera等,此外,客户端的命令行工具还有elink、curl等。Web服务是基于TCP的,因此为了能够随时响应客户端的请求,Web服务器需要监听在80/TCP端口。这样客户端浏览器和Web服务器之间就可以通过HTTP进行通信了。";

1.1 提取上述文本所有的英文单词

    public static void main(String[] args) 
        /*
         * 1.1 先创建一个Pattern对象,模式对象(正则表达式对象)
         */
        Pattern pattern = Pattern.compile("[a-zA-Z]+");
        /*
         * 1.2 创建一个匹配器对象()
         * 理解:就是 matcher匹配器按照pattern(模式/样式),到 content文本中去匹配找到就返回true,否则就返回false
         */
        Matcher matcher = pattern.matcher(content);
        /*
         * 3. 开始循环匹配
         */
        while (matcher.find()) 
            // 匹配内容,文本,放到 m.group(0)
            System.out.print(matcher.group(0) + " ");
        
    

运行结果:


1.2 提取上述文本所有的数字

按照上面的代码,只需要改一下正则表达式就行了。

Pattern pattern = Pattern.compile("[0-9]+");

运行结果:


1.3 提取上述文本中所有的文本和英文单词

按照上面的代码,只需要改一下正则表达式就行了。

Pattern pattern = Pattern.compile("([0-9]+)|([a-zA-Z]+)");

运行结果:


1.4 查找热搜消息

假设现在文本的内容变为了下面这个,我们需要找到里面所有的title。

    String content = "    <a target=\\"_blank\\" title=\\"热搜新闻1\\" href=\\"#\\">热搜新闻1</a>\\n" +
            "    <a target=\\"_blank\\" title=\\"热搜新闻2\\" href=\\"#\\">热搜新闻1</a>\\n" +
            "    <a target=\\"_blank\\" title=\\"热搜新闻3\\" href=\\"#\\">热搜新闻1</a>\\n" +
            "    <a target=\\"_blank\\" title=\\"热搜新闻4\\" href=\\"#\\">热搜新闻1</a>";
    public static void main(String[] args) 
        /*
         * 1.1 先创建一个Pattern对象,模式对象(正则表达式对象)
         */
        Pattern pattern = Pattern.compile("<a target=\\"_blank\\" title=\\"(\\\\S*)\\"");
        /*
         * 1.2 创建一个匹配器对象()
         * 理解:就是 matcher匹配器按照pattern(模式/样式),到 content文本中去匹配找到就返回true,否则就返回false
         */
        Matcher matcher = pattern.matcher(content);
        /*
         * 3. 开始循环匹配
         */
        while (matcher.find()) 
            // 匹配内容,文本,放到 m.group(1)
            System.out.print(matcher.group(1) + " ");
        
    

运行结果:


1.5 查找IP地址

假设现在文本的内容变为了下面这个,我们需要找到里面所有的IP地址。

String content = "本机IP: 123.147.251.81重庆市重庆 联通 " +
            "本机IP: 123.147.251.82重庆市重庆 联通 " +
            "本机IP: 123.147.251.83重庆市重庆 联通 ";
    public static void main(String[] args) 
        /*
         * 1.1 先创建一个Pattern对象,模式对象(正则表达式对象)
         */
        Pattern pattern = Pattern.compile("\\\\d+\\\\.\\\\d+\\\\.\\\\d+\\\\.\\\\d+");
        /*
         * 1.2 创建一个匹配器对象()
         * 理解:就是 matcher匹配器按照pattern(模式/样式),到 content文本中去匹配找到就返回true,否则就返回false
         */
        Matcher matcher = pattern.matcher(content);
        /*
         * 3. 开始循环匹配
         */
        while (matcher.find()) 
            // 匹配内容,文本,放到 m.group(0)
            System.out.println(matcher.group(0));
        
    

运行结果:


2. 正则表达式介绍(regular expression,简称regex)

正则表达式(regular expression,简称regex)是文本处理方面功能最强大的工具之一,正则表达式语言用来构造正则表达式(最终构造出来的字符串就称为正则表达式),正则表达式用来完成搜索和替换操作。


3. Java中正则表达式的语法

如果要想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:

  • 限定符
  • 选择匹配符
  • 分组组合符
  • 反向引用符
  • 特殊字符
  • 字符匹配符
  • 定位符

在Java的正则表达式中,两个\\\\代表其他语言中的一个\\

示例:

    public static void main(String[] args) 
        String content = "abc(def(g";
        /*
         * 1.1 先创建一个Pattern对象,模式对象(正则表达式对象)
         */
        Pattern pattern = Pattern.compile("\\\\(");
        /*
         * 1.2 创建一个匹配器对象()
         * 理解:就是 matcher匹配器按照pattern(模式/样式),到 content文本中去匹配找到就返回true,否则就返回false
         */
        Matcher matcher = pattern.matcher(content);
        /*
         * 3. 开始循环匹配
         */
        while (matcher.find()) 
            // 匹配内容,文本,放到 m.group(0)
            System.out.println(matcher.group(0));
        
    

运行结果:


3.1 RegEx字符匹配符


3.1.1 RegEx字符匹配符说明



3.1.2 案例

匹配a-z直接的任意一个字符:

    public static void main(String[] args) 
        String content = "$ztj2000317LOL?";
        // 匹配a-z直接的任意一个字符
        Pattern pattern = Pattern.compile("[a-z]");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

运行结果:

匹配A-Z直接的任意一个字符:

    public static void main(String[] args) 
        String content = "$ztj2000317LOL?";
        // 匹配A-Z直接的任意一个字符
        Pattern pattern = Pattern.compile("[A-Z]");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

运行结果:

匹配A-Z中连续的3个字符:

    public static void main(String[] args) 
        String content = "$ztj2000317LOL?";
        // 匹配A-Z中连续的3个字符
        Pattern pattern = Pattern.compile("[A-Z]3");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

运行结果:

匹配特殊字符:

    public static void main(String[] args) 
        String content = "$ztj2000317LOL?";
        // 匹配特殊字符
        Pattern pattern = Pattern.compile("\\\\W");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

运行结果:


3.2 RegEx匹配时不区分大小写

Java正则表达式默认是区分字母大小写的,下面几种方式可以实现不区分大小写。

  • 使用(?i)表达式
  • 在构建正则表达式的时候选择不区分大小写: Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

示例:使用(?i)表达式

    public static void main(String[] args) 
        String content = "CodeJiao";
        // 匹配CodeJiao
        Pattern pattern = Pattern.compile("(?i)codejiao");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group());
        
    

运行结果:

示例:在构建正则表达式的时候选择不区分大小写

    public static void main(String[] args) 
        String content = "CodeJiao";
        // 匹配CodeJiao
        Pattern pattern = Pattern.compile("codejiao", Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group());
        
    

运行结果:


3.3 RegEx选择匹配符

示例:匹配Code或者Jiao

    public static void main(String[] args) 
        String content = "CodeJiaoYYDS";
        // 匹配Code或者Jiao
        Pattern pattern = Pattern.compile("Code|Jiao");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

运行结果:


3.4 限定符


3.4.1 限定符说明

用于指定其前面的字符和组合项连续出现多少次


3.4.2 限定符案例

匹配连续的2个数字:

    public static void main(String[] args) 
        String content = "11aaaabbccccc22";
        // 匹配连续的2个数字
        Pattern pattern = Pattern.compile("\\\\d2");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

运行结果:

匹配aaa

    public static void main(String[] args) 
        String content = "11aaaabbccccc22";
        // 匹配aaa
        Pattern pattern = Pattern.compile("a3");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

运行结果:

cc…

    public static void main(String[] args) 
        String content = "11aaaabbccccc22";
        // 匹配cc...
        Pattern pattern = Pattern.compile("c2,");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

运行结果:

匹配一个及以上的1

    public static void main(String[] args) 
        String content = "11aaaabbccccc22";
        // 匹配一个及以上的1
        Pattern pattern = Pattern.compile("1+");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

运行结果:

匹配0个及以上的1

    public static void main(String[] args) 
        String content = "11aaaabbccccc22";
        // 匹配0个及以上的1
        Pattern pattern = Pattern.compile("1?");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

y


3.4.3 Java贪婪匹配策略

示例代码

    public static void main(String[] args) 
        String content = "11aaaabbccccc22";
        // 匹配aaa 或者 aaaa
        Pattern pattern = Pattern.compile("a3,4");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

运行结果:上面的正则表达式可以匹配aaa或者aaaa,但是默认是贪婪匹配,意思是优先匹配较长元素。


3.4.4 非贪婪匹配实现

示例代码

    public static void main(String[] args) 
        String content = "11aaaabbccccc22";
        // 在正则表达式后面加一个?即可实现非贪婪匹配
        Pattern pattern = Pattern.compile("a3,4");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

运行结果:


3.5 定位符


3.5.1 定位符介绍

定位符,规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置,这个也是相当有用的。


3.5.2 定位符案例

示例1:以至少1个数字开头,后接任意个小写字母的字符串。

    public static void main(String[] args) 
        String content = "123-abc";
        // 以至少1个数字开头,后接任意个小写字母的字符串。
        Pattern pattern = Pattern.compile("^[0-9]+[a-z]*");
        Matcher matcher = pattern.matcher(content);
        while (matcher.find()) 
            System.out.println(matcher.group(0));
        
    

运行结果:

示例2:匹配边界值codejiao

    public static void main(String[] args) 
        String content = "codejiao yyds codejiao";
        // 匹配边界值codejiao。
        Pattern pattern = Pattern.compile("codejiao\\\\b");
        Matcher matcher = pattern以上是关于Java正则表达式介绍和使用规则(Pattern类Matcher类PatternSyntaxException类)的主要内容,如果未能解决你的问题,请参考以下文章

java正则表达式怎么书写?

Java中正则表达式以及Pattern和Matcher类

java正则表达式,要求字符串只能包含数字、英文大小写、以及“-”符号

Java正则表达式Pattern和Matcher类

java正则表达式

使用Java操作正则表达式