正则表达式

正则表达式

正则表达式用于模糊匹配

基本用法

限定符

限定符: ? 代表前面的字符需要出现0个或1个

d? //代表前面的d需要出现0个或1个

限定符: * 代表前面的字符只能出现0个或多个

ab*c //代表b只能出现0个或多个

限定符:+ 匹配前面的字符出现一次以上

ab+c //匹配出现一次以上的字符

限定符: {…} 指定花括号前的字符出现的次数

ab{2,6}c //指定花括号前的字符出现的次数(2-6次)

在匹配多个字符出现的次数时 使用 ()

(ab){2,6}c //指定ab字符出现的次数(2-6次)

运算符

“或”运算符: |

(cat|cog) //cat 或 dog

字符类

字符类: [ ] 代表只选取方括号[]内匹配的字符

[abc]+ //代表只选取方括号[]内匹配的字符

连字符: – 用来限定范围

    [a-b]   //限定范围为a-b
    [A-B]   //限定范围为A-B
    [0-9]   //限定范围为0-9

尖号 ^ 字符 代表^后面列出的以外的字符

^[a-z] //代表除小写a-z以外的字符

元字符

例如: \d \w \s \D \W \S …

数字字符: \d (相当于前面的[0-9])

非数字字符: \D (相当于前面的^[0-9])

单词字符:\w (指所有英文字符、数字和下划线 _)

非单词字符:\W (指所有非英文字符、数字和下划线 _)

空白符: \s (包含Tab(制表符)和换行符)

非空白符: \S (除了Tab(制表符)和换行符)

特殊字符:. 代表任意字符,但不包含换行符

特殊字符

特殊字符: ^ 用于匹配行首

特殊字符: $ 用于匹配行尾

贪婪匹配和懒惰匹配

会匹配整串字符串 因为是贪婪匹配

<.+>

只匹配两个标签代码, +?设置为懒惰匹配

<.+?">

捕获组 ()

()

使用圆括号来创建一个捕获组,可以将匹配的内容作为一个整体处理。

捕获组可以通过反向引用 \1, \2 等来引用,其中数字表示第几个捕获组。

        // 正则表达式会对捕获组进行自动的编号
// 编号是从1开始的
// 编号是从 ( 出现的位置开始计算
// (A((BC)D(E))F)(G)(W)
// \\1 A((BC)D(E))F
// \\2 (BC)D(E)
// \\3 BC
// \\4 E
// \\5 G
// \\6 W

非捕获组

(?:...)

不会保存匹配的内容,仅用于分组。

代码案例:

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

public static void method() {
    String str = "9";
    // 匹配字符串
    // 第一个字符 a b c d
    // 第二个字符 6 7 8 9
    // 第三个字符 q w e
    Pattern pattern = Pattern.compile("[abcd][6789][qwe]");
    Matcher matcher = Pattern.matcher(str);
    System.out.println(matcher.matches());
    System.out.println(str.matcher("[a-d][6-9][qwe]"));

    //判断由一个小写字母组成的字符串
    System.out.println(str.matches("[a-z]"));

    //判断由一个字母组成的字符串
    //只要是连续的范围 就可以使用“-” a-z
    System.out.println("[a-zA-z]");

    //匹配由一个数字组成的字符串
    System.out.println("[0-9]");

    //判断由一个字符组成的字符串
    System.out.println(str.matches("[^abc]"));

    //匹配由3个字符组成的字符串
    //开头是数字,结尾是字母
    // .通配符 表示任意一个字符
    System.out.println("\\d.[a-zA-Z]]");

    //匹配 .
//        boolean matches = str.matches("[.]");
    boolean matches = str.matches("\\.");
    System.out.println(matches);
    String str = "98";
    // 匹配由10个数字组成的字符串
    // {n}: 表示这个字符出现恰好是n次   == n
    System.out.println(str.matches("\\d{10}"));

    // 匹配由至少10个数字组成的字符串
    // {n,} 表示这个字符至少出现n次   >= n
    System.out.println(str.matches("\\d{10,}"));

    // 匹配由5-10个数字组成的字符串
    // {n,m} 表示这个字符至少出现n次,最多出现m次  n <= x <= m
    System.out.println(str.matches("\\d{5,10}"));

    // 判断一个字符串是否出现了4个及以上的连续数字
    System.out.println(str.matches(".*\\d{4}.*"));
    // 判断字符串种是否出现了2个及以上的数字  
    System.out.println(str.matches(".*\\d.*\\d.*"));
}

练习

// 定义一个方法,输入一个字符串作为密码,要求6-12位,并且由大写字母/小写字母/数字/空格组成,并且至少出现2种
public static boolean checkPassword(String password) {
    if (!password.matches("[a-zA-Z\\d ]{6,12}")) {
        return false;
    }
    // 定义变量,记录字母类型种类的次数
    int count = 0;
    // 判断是否出现了大写字母
    if (password.matches(".*[A-Z].*")) {
        count++;
    }
    // 判断是否出现了小写字母
    if (password.matches(".*[a-z].*")) {
        count++;
    }
    // 判断是否出现了数字
    if (password.matches(".*\\d.*")) {
        count++;
    }
    // 判断是否出现了空格
    if (password.matches(".* .*")) {
        count++;
    }
    return count >= 2;

}

relpaceAll

public static void method() {
    String str = "gr7g!%&h8rg&*O($@eg6gtght5reg";
    // 将字符串中的数字全部替换成-
    System.out.println(str.replaceAll("\\d", "-"));
    // 获取这个字符串中所有的数字
    System.out.println(str.replaceAll("\\D", ""));
    // 替换字符串中的所有的非字母
    System.out.println(str.replaceAll("[^a-zA-Z]", ""));

    // 交换字符串的内容
    String str2 = "范冰冰 李晨 张柏芝 陈冠希";
    System.out.println(str2.replaceAll("(.*)(李晨)(.*)(陈冠希)", "$1$4$3$2"));

    // 把叠字变成单字
    String str3 = "我我我我我我我爱爱爱爱爱爱你你你你你你你你";
    System.out.println(str3.replaceAll("(.)\\1+", "$1"));// 输入一个字符串,统计每一个字符出现的次数
    // aaabbcccadd
}

private static void demo3() {
    String str = new Scanner(System.in).next();
    // 如果字符串中有内容
    while (str.length() != 0) {
        // 获取替换之前的字符串的长度
        int oldLen = str.length();

        // 获取字符串的第一个字符
        char c = str.charAt(0);
        String regex = "";
        if (c == '+' || c == '*' || c == '?' || c == '$' || c == '\\') {
            regex = "\\" + c;
        } else {
            regex = c + regex;
        }
        //把字符替换成 ""
        str = str.replaceAll(regex, "");

        System.out.println("字符" + c + "出现的次数是" + (oldLen - str.length()));
    }
}

split

public static void method() {
    //        String str = "10,110,210,3";
//        // 分割字符串
//        String[] split = str.split(",");
//        for (String s : split) {
//            System.out.println(s);
//        }
    String str = "11gfreg998grg8hth7hth9567567";
    // 分隔符如果是在最后,会直接被切点,无论有多少个
    // 放在中间的分隔符,如果有多个,超出1个的分隔符每个都会分割一个""
    // 放在开头的分隔符,会切出""  有几个切几个
    String[] split = str.split("\\d");
    for (String s : split) {
        System.out.println(s);
    }
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇