java之正则表达式

1.正则表达式

1)什么是正则表达式

正则表达式用来定义一个搜索模式的字符串,可以用于搜索,编辑和操作文本,正则表达式对文本的分析或修改过程为:首先应用文本字符串,它会以定义的模式从左到右匹配文本,并且每个源字符只匹配一次。

2)示例

正则表达式 说明
this is string text 精确匹配字符串"this is string text"
this\s+is\s+string\s+text 匹配this后跟一个或多个字符串,后跟is,然后is后面跟一个或多个字符串,然后跟string,然后跟一个或多个字符串,然后跟text
^\d+(\.\d+)? ^表示匹配字符串的开始,d+匹配一个或多个数字,?表示小括号内的语句是可选的,\.匹配.,小括号表示分组

 

 

 

 

 

 

 

2.正则表达式的编写规则

1.常用的匹配符号

正则表达式 说明
. 匹配所有单个字符,除了换行符(linux换行符为\n,windows换行符为\r\n)
^regex 匹配以regex开头
regex$ 匹配以regex结尾
[abc] 匹配a或b或c
[abc][xyz] 匹配a或b或c,后面跟x或y或z
[^abc] 匹配不包含a或b或c
[a-z0-9] 范围匹配,匹配a到z和数字0-9之间的一个值
AB 匹配A然后后面跟着B
A|B 匹配A或者B

 

 

 

 

 

 

 

 

2.元字符

元字符表示一个预定义的字符。

正则表达式 说明
\d 匹配一个数字,是[0-9]的简写
\D 匹配一个非数字,是[^0-9]的简写
\s 匹配一个空格
\S 匹配一个非空格
\w 匹配一个单词字符(字母,数字,下划线)
\W 匹配一个非单词字符

 

 

 

 

 

 

3.限定符

限定符用来表示一个元素可以出现的频率。

正则表达式 说明 示例
* 匹配0个或多个 x*表示匹配0个或多个x,.*代表任意字符串
+ 匹配1个或多个 x+表示匹配1个或多个x
? 匹配1个或者0个 x?表示匹配0个x或者1个x
{x} 只匹配x个字符 \d{3}表示匹配3个数字
{x,y} 表示匹配大于等于x并且小于等于y \d{1,4}匹配至少一个至多4个数字
*? 如果?是限定符*或+或?或{}后的第一个字符,表示非贪婪模式,尽可能少的匹配字符  

 

 

 

 

 

 

4.分组和反向引用

小括号()可以对正则表达式进行分组。创建分组会在正则表达式中创建反向引用,反向引用会保存匹配模式分组的字符串片段,这样我们就可以使用这些字符串片段,我们可以使用$来引用分组的反向引用,$0表示匹配完整模式的字符串,$1表示第一个分组的反向引用,以此类推。

public class Demo02 {
    public static void main(String[] args) {
        /***
         * 去除o和,n和.之间的空格
         * $0:o 和 n .
         * $1:o和n
         * $2:空格
         * $3:,和.
         */
        String s = "Hello , boxiaoyuan .";
        String pattern = "(\\w)(\\s+)([,.])";
        System.out.println(s.replaceAll(pattern, "$1$3"));
    }
}

5.易错点

[jpg|png]表示匹配j或p或g或p或n或g中的任意一个字符。

(jpg|png)表示匹配jpg或者png中的一个。

3.字符串使用正则表达式

1.内置的字符串正则处理方法

java中内置四个运行正则表达式的方法,matcher(),split(),replaceFirst(),replaceAll(),relpace方法不支持正则表达式。

方法 说明
s.matches("regex") 仅当正则表达式匹配整个字符串时返回true
s.split("regex") 按匹配的正则表达式切片字符串
s.replaceFirst("regex") 替换首次匹配的字符串片段
s.replaceAll("regex") 替换所有匹配的字符

 

 

 

 

示例:

public class Demo02 {
    public static void main(String[] args) {
        System.out.println("boxiaoyuan".matches("boxiaoyuan")); 
        String[] strs = "bo xiao yuan".split("\\s");
        for(String str : strs) {
            System.out.println(str);
        }
        
        System.out.println("bo xiao yuan".replaceFirst("\\s", "-"));
        
        System.out.println("bo xiao yuan".replaceAll("\\s", "-"));
    }
}

4.模式和匹配

java中使用正则表达式需要使用两个类,分别是java.util.regex.Pattern和java.util.regex.Matcher。

使用方法:

              第一步:通过正则表达式创建模式对象Pattern。

    第二步:通过模式对象Pattern,根据指定字符串创建匹配对象Macher。

    第三步:通过匹配对象Matcher,根据正则表达式操作字符串。

示例:

public class Demo02 {
    public static void main(String[] args) {
        String s = "hello boxiaoyuan!";
        Pattern pattern = Pattern.compile("\\w+", Pattern.CASE_INSENSITIVE); // 通过正则表达式创建模式对象Pattern, 不区分大小写
        
        Matcher matcher = pattern.matcher(s); // 根据指定字符串创建匹配对象 matcher
        
        while(matcher.find()) {
            System.out.println("start index:" + matcher.start());
            System.out.println("end index:" + matcher.end());
            System.out.println(matcher.group());
        }
        // 创建第二个模式,用于把空格替换为-
        Pattern replace = Pattern.compile("\\s");
        Matcher matcher2 = replace.matcher(s);
        System.out.println(matcher2.replaceAll("-"));
    }
}

---------输出结果----------
start index:0
end index:5
hello
start index:6
end index:16
boxiaoyuan
hello-boxiaoyuan!

 

参考:https://segmentfault.com/a/1190000009162306

 

posted @ 2019-04-19 09:17  博小园  阅读(286)  评论(0编辑  收藏  举报
回到顶部