文档章节

Java基础高级2、正则表达式

南风末
 南风末
发布于 2017/05/01 10:49
字数 2654
阅读 0
收藏 0

170430        02_普通字符和元字符

1、正则表达式中,所有字符分为两类:普通字符和元字符(具有特殊含义的字符) 主要普通字符:小写字母、大写字母、数字、下划线、部分特殊符号、非西文字符等 主要元字符:.   \   { }  *   +   ?   ( )   [ ]   -   |   ^   $ .  

2、表示任意一个字符(除了换行符)

\     转移符,用来改变其他字符的含义,如:    

   \元字符        把元字符转义为普通字符,如\.  把元字符 . 转义为普通字符的 .  

     \普通字符    把普通字符转义为含有特殊含义的字符,如:            

  \n          换行符          

    \r           回车符            

  \t               制表符            

  \uxxxx   匹配十六进制数xxxx代表的Unicode字符

170501           04_元字符的用法

package test;

import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {
        /*    //组成正则的基本单位是字符,
        String regex = "abc";//正则要求“abc”,str = "abc";
        //字符序列
        String str = "abcd";*/

        /*String regex = ".";
        String str = "a";
        
        boolean match = Pattern.matches(regex, str);//判断传入的字符是否匹配正则要求的结果
        System.out.println(match);//true*/

        String regex = "\\.";//正则要求“.”,(\与java规则冲突,先用\转义即后面内容为正则要求)
        String str = ".";//实际满足要求即true

        boolean match = Pattern.matches(regex, str);//判断传入的字符是否匹配正则要求的结果
        System.out.println(match);//true
    }

}

170501        05_重复匹配

package test;

import java.util.regex.Pattern;

public class RegexTest {

    public static void main(String[] args) {
        /*    //组成正则的基本单位是字符,
        String regex = "abc";//正则要求“abc”,str = "abc";
        //字符序列
        String str = "abcd";*/

        /*String regex = ".";
        String str = "a";
        
        boolean match = Pattern.matches(regex, str);//判断传入的字符是否匹配正则要求的结果
        System.out.println(match);//true*/

        /* String regex = "\\.";//正则要求“.”,(\与java规则冲突,先用\转义即后面内容为正则要求)
        String str = ".";//实际满足要求即true
        
        boolean match = Pattern.matches(regex, str);//判断传入的字符是否匹配正则要求的结果
        System.out.println(match);//true*/

        /* String regex = "a{3}";//要求a连续出现3次
        String str = "aaa";*/

        /*String regex1 = "a{0}";//要求a连续出现0次
        String str1 = "";//但不能有其他的字符*/

        /*String regex2 = "(helloa){3}"; //用括号来改变优先级
        String str2 = "helloahelloahelloa";*/

        /*String regex = "a{3,}";//至少三个字符
        String str = "aaaaa";*/

        /*String regex = "a{3,5}";//要求a至少连续出现3次,至多5次
        String str = "aaaa";*/

        /*String regex = "a*";//要求a连续出现0次或多次。  等同于 a{0,}
        String str = "aa";*/

        /* String regex = "a+";//要求a至少连续出现1次   等同于 x{1,}
        String str = "aaa";*/

        String regex = "a?";//要求a出现0次或一次  a{0,1}
        String str = "";

        boolean match = Pattern.matches(regex, str);//判断传入的字符是否匹配正则要求的结果
        System.out.println(match);

    }

}

(x表示一个字符,或者一个字符类,或者一个组等)

x{n}    x连续出现n次

x{n,}   x至少连续出现n次

x{n,m}  x至少连续出现n次,至多连续出现m次

x*      x连续出现0次或多次,等同于x{0,}

x+     x至少连续出现1次,等同于x{1,}

x?     x出现0次或1次,等同于x{0,1}

170501         06_选择匹配

   //        String regex = "a|b|c";//选择匹配字符  str可为三者中任一个
        //        String str = "c";
        String regex = "red|blue|green";
        String str = "red";

170501          07_字符类

 /* String regex = "hello[abc]";//等同于 “a|b|c”;而helloa|b|c;结果就只是helloa或b或c
        String str = "helloa";//hello+a\b\c三者任一个*/

        /*  String regex = "[^abc]";//只匹配非a、b、c的任一个字符
        String str = "d";//^放中间时只表示普通字符 ^
        */
        /* String regex = "[0-9]";//范围内的一个字符   -放中间报错,放末尾表示普通字符 - 
        String str = "4";//只能是一个字符*/

        /*//        String regex = "[a-z]";//范围内的任一个字符
        //        String str = "r";
        //可以多个范围合并
        String regex = "[a-zA-z]";//[0-9a-zA-Z]、三个范围
        String str = "R";*/

        /*        String regex = "[.]";//字符类中的元字符回被自动转换为普通字符,即等同于 [\.]  *但是一个\不会被转换
        String str = ".";//   "." 不再具有元字符的属性,只是普通字符  .
        */ // \在字符类中

        /* String regex = "[\\\\]";//两两匹配\\,前一个转义,后一个普通\
        String str = "\\";//只要一个\时怎么办?*/

        // \w  表示一个字符类, 类似于[a-zA-Z0-9]
        /* String regex = "\\w"; //正则:\w   匹配一个单词字符、范围[a-zA-Z0-9]
        String str = "好";//Java中该正则不支持中文   有的语言支持*/

        /* String regex = "\\W";// 正则:[^a-zA-Z0-9] 匹配一个非单词字符
        String str = "好";//支持中文,上述两个表示可以互换*/

        /*String regex = "\\s";//代表一个空白字符
        String str = "\t";*/

        String regex = "\\S";//非空白字符
        String str = "a";

字符类这个概念不易理解,只要记住它的用法就可以:匹配候选字符的任意一个

[ ]          [abc]      匹配abc中任意一个字符,类似 a|b|c

[^ ]      [^abc]      匹配非abc的任意一个字符  //  ^放其他位置(中间或末尾)时只表示普通字符 ^

[ - ]        [0-9]、[a-z]、[a-zA-Z]   匹配范围内的任意一个字符

注意:字符类中的元字符(\除外),会被自动转义为普通字符,比如 [.]  等同于  [\.]

\w    代表一个单词字符,类似于[a-zA-Z0-9_],有的语言中也可以匹配中文

\W    代表一个非单词字符,类似于[^a-zA-Z0-9_]

\d    代表一个数字字符,等同于[0-9]

\D    代表一个非数字字符,等同于[^0-9]

\s    代表一个空白字符   如:\t   \n   \r

\S    代表一个非空白字符   abc   123

170501       08_Matcher类

package test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest2 {

    public static void main(String[] args) {
        /*     String regex = "ab";//正则要求str的子字符串substr = “ab”
        String str = "zsdabgdavabdfab";*/

        //打印出一个字符串里面的所有的qq邮箱
        String regex = "[1-9][0-9]{4,}@qq.com";//qq邮箱的正则表达式写法
        String str = "zs12344@qq.comdab6896533@qq.comgdavab886534254@qq.comdfab";

        Pattern pattern = Pattern.compile(regex);//创建一个正则表达式Pattern类对象
        //并传入表达式
        //创建一个匹配器类 Matcher,获得对象pattern的matcher属性并传入要匹配的字符串
        Matcher matcher = pattern.matcher(str);//charsequense类型,

        /*  boolean find = matcher.find();//查找str中是否有下一个匹配regex的子字符串
        boolean find2 = matcher.find();
        String group = matcher.group();// 返回当前和regex匹配的子字符串
        //方法group不能独立于find使用,不然会报错*/

        //如果有下一个就取出下一个
        while (matcher.find()) {
            String group = matcher.group();
            System.out.println(group);
        }
        // System.out.println(group);//true
    }

}

170501      09_贪婪匹配和非贪婪匹配

贪婪匹配:在重复匹配时,默认会匹配尽可能多的字符

非贪婪匹配:在重复匹配后面加上?问号,会匹配尽可能少的字符(并不严格)

        String regex = "[1-9][0-9]{4,}?";//别打成了中文的?       
        String str = "zs12344@qq.comdab6896533@qq.comgdavab886534254@qq.comdfab";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);

        while (matcher.find()) {
            String group = matcher.group();
            System.out.println(group);//结果只有5个数字
        }

170501     10_String支持正则操作的方法

package test;

import java.util.Arrays;

public class RegexTest3 {

    public static void main(String[] args) {
        String str = "7ty34rq646d";

        /*String newStr = str.replaceAll("[0-9]", "*");
        System.out.println(newStr);*/

        //以数字为界切割字符串
        String[] parts = str.split("[0-9]+");//获取分隔后返回的字符串,
        //若没有+则将每个数字切成空字符串,有则会将一起的合并为一个
        System.out.println(Arrays.toString(parts));//用Arrays方法取出数组里的元素
        //数字在开头会有空字符串如:[, ty, rq, d],在末尾则没有

        //判断字符串是否匹配的方法
        boolean match = str.matches("7ty34rq646d");//同Pattern方法,调用的就是Pattern
        System.out.println(match);//true
    }

}

//使用replacement替换全部匹配regex的子字符串

String newStr = str.replaceAll(regex, replacement);

String[] newStrs = str.split(regex);//使用regex作为分隔符切分str

boolean match = str.matches(regex);// 等同于Pattern.matches(regex, str)

170501         11_位置匹配 

package test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTestwb {
    public static void main(String[] args) {
        String regex = "\\bhello\\b";
        String str = "xx hello,hello aagrs,hellob";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(str);

        while (matcher.find()) {
            String group = matcher.group();
            System.out.println(group);

        }
    }

}

正则中的匹配有两种,一种是匹配具体的字符,另一种是匹配特定的位置

^    匹配文本开始位置

$    匹配文本结束位置

\b   匹配单词边界(单词开始位置或结束位置)

校验操作时,是否使用 ^和$ 对校验操作没有影响

获取、替换等操作时,一般不使用 ^和$

170501         12_组

  //组
        /* String regex = "red|blue|green";
        String str = "red";*/

        /*String regex = "(red|blue|green) color";
        String str = "red color";*/

        /*String regex = "(ab)cd";
        String str = "abcd";*/

        /*String regex = "(ab)c\\1";//  \1对组(第一组)的引用
        String str = "abcabab";*/

        /*  String regex = "([ab])\\1";//正则字符类要求:(str = "a"或“b”)   组的要求、别落了()
        // String str = "aa";// \1 表示引用了“a”
        //当组选定了是“b”时,\1引用的就是"b"了
        String str = "bb";//true*/

        String regex = "(a)(b)\\1\\2";
        String str = "abab";

        boolean match = Pattern.matches(regex, str);//判断传入的字符是否匹配正则要求的结果
        System.out.println(match);

注:在匹配时,组的当前 "取值" 会被临时保存起来,方便引用。

可以使用 \1 引用第一个组的当前"取值",最多可以引用九个不同的组:\9

170501        13_标记

        String regex = "\\bhello\\b";
        String str = "xx Hello,heLlo  helloa";
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(str);

        //如果有下一个就取出下一个
        while (matcher.find()) {
            String group = matcher.group();
            System.out.println(group);
        }

标记用来额外指定正则的匹配策略(标记可以不写在正则表达式内)

i         大小写不敏感  insensitive(也可以理解成ignore)

g        全局匹配  global 效果是可以依次的获取到和正则匹配的所有子字符串

m       多行匹配  multiline 效果是^和$可以匹配一段文本中每行的开始和结束位置

在Java中:

在创建正则对象时可以通过 Pattern.compile(regex, flags)  指定标记

使用Pattern.CASE_INSENSITIVE 常量表示 i

使用Pattern.MULTILINE 常量表示 m

正则操作默认就是全局匹配的

 

170501     14_ 常用正则表达式

校验数字:^[0-9]*$

校验整数或者小数:^[0-9]+([.][0-9]+){0,1}$

校验qq号:[1-9][0-9]{4,} 校验手机号:  ^1[34578]\d{9}$

校验身份证:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|x|X)$)

验日期(格式:yyyy-mm-dd,已考虑平闰年):^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

校验email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

校验URL:^[a-zA-z]+://[^\s]*$

 

结束:

只是学正了 则表达式的主要语法和概念,包括普通字符、元字符、重复匹配、选择匹配、字符类、位置匹配、组、标记等

© 著作权归作者所有

南风末
粉丝 6
博文 228
码字总数 313035
作品 0
南昌
程序员
私信 提问
【Scala】Scala高级使用技巧之二

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/gongxifacai_believe/article/details/82111814 1、重写field的提前定义 默认情况下,如果父类中的构造函数代码,用...

魏晓蕾
2018/08/27
0
0
java.util.regex Pattern 正则

/**String 中 replaceAll(),matches(),split() 等方法,都是调用Pattern中的方法。学习了,瞬间觉得Pattern强大了 public String replaceAll(String regex, String replacement) {return Pat......

happycode
2014/04/02
0
1
为 Java 程序员准备的 10 分钟 Perl 教程

这10分钟教程并不是Java和Perl的比较。目标是探索作为Java开发人员如何快速学习Perl。以下是一些从我的角度来看的关键笔记。 1.从基础开始 不像java,Perl不需要“main”方法作为入口点。要运...

oschina
2013/11/08
7.6K
17
java正则表达式对字符串的操作

学习java正则表达式的都知道,它的重要性;但同时也了解它的难度和复杂性。所以为了加深我们对它的了解。我举了几个例子: 例子1、 查找以Java开头,任意结尾的字符串 Pattern pattern = Patt...

goqin
2012/06/29
0
0
Java魔法堂:深入正则表达式API

目录                               一、前言 二、正则表达式的使用诉求 三、java.util.regex包 四、java.lang.String实例 五、最短路径实现诉求 六、Java支...

fsjohnhuang
2014/11/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Android双向绑定原理简述

Android双向绑定原理简述 双向绑定涉及两个部分,即将业务状态的变化传递给UI,以及将用户输入信息传递给业务模型。 首先我们来看业务状态是如何传递给UI的。开启dataBinding后,编译器为布局...

tommwq
今天
4
0
Spring系列教程八: Spring实现事务的两种方式

一、 Spring事务概念: 事务是一系列的动作,它们综合在一起才是一个完整的工作单元,这些动作必须全部完成,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。...

我叫小糖主
今天
8
0
CentOS 的基本使用

1. 使用 sudo 命令, 可以以 root 身份执行命令, 必须要在 /etc/sudoers 中定义普通用户 2. 设置 阿里云 yum 镜像, 参考 https://opsx.alibaba.com/mirror # 备份mv /etc/yum.repos.d/CentO...

北漂的我
昨天
4
0
Proxmox VE技巧 移除PVE “没有有效订阅” 的弹窗提示

登陆的时候提示没有有效的订阅You do not have a valid subscription for this server. Please visit www.proxmox.com to get a list of available options. 用的是免费版的,所以每次都提示......

以谁为师
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部