美文网首页
正则表达式 JAVA 示例

正则表达式 JAVA 示例

作者: 凯睿看世界 | 来源:发表于2020-12-08 16:36 被阅读0次

    定义:

    正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。

    正则表达式百度百科定义

    要点

    1.正则是匹配模式,要么匹配字符,要么匹配位置。
    2.在正则中可以使用括号捕获数据,要么在API中进行分组引用,要么在正则里进行反向引用。

    正则表达式在JAVA中的应用:

    Java 正则表达式和 Perl 的是最为相似的。
    java.util.regex 包主要包括以下三个类:

    Pattern 类:
    pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

    Matcher 类:
    Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

    PatternSyntaxException:
    PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。

    在JAVA中的基础运用
    1:捕获数组
    2:查询方法
    3:替换方法

    常被用到的正则表达式

    1:如何从字符串中提取数字

    在JAVA中, \d表示(0-9)范围的数字.尽量使用正则表达式可以使
    请注意\ d中的第一个反斜杠.如果您在字符串文本中使用预定义字符(特殊字符),则必须在反斜杠之前加上另一个反斜杠,以便转义该字符串。 这就是为什么我们需要使用\d

    List<Integer> numbers = new LinkedList<Integer>();
    Pattern p = Pattern.compile("\\d+");
    Matcher m = p.matcher(str);
    while (m.find()) {
    numbers.add(Integer.parseInt(m.group()));
    }
    

    2:如何根据换行来拆分字符串

    根据不同的系统,至少有如下3中换行分隔符

    \r represents CR (Carriage Return), which is used in Unix
    \n means LF (Line Feed), used in Mac OS
    \r\n means CR + LF, used in Windows
    
    String lines[] = String.split("\\r?\\n");
    String.split("[\\r\\n]+")
    String.split(System.getProperty("line.separator"));
    

    Pattern.compile()的重要性

    Pattern.compile()方法是创建Pattern对象实例的唯一方法。一般如下使用

    //创建Pattern对象
    Pattern p = Pattern.compile("a*b");
    //创建Matcher对象
    Matcher matcher = p.matcher("aaaaab");
    //判断是否匹配
    assert matcher.matches() == true;
    
    //-----Patternd对象实例p只需创建一次,可以多少使用,匹配不同的Matcher-----------
    Matcher anotherMatcher = p.matcher("aab");
    assert anotherMatcher.matches() == true;
    
    //-----------Pattern.matches 只能使用一次--------------------------------------------------
    boolean b = Pattern.matches("a*b", "aaaaab");
    
    

    文本类容如果使用表达式

    一般使用斜杠""来转译,但在字符串内容时,有些麻烦别扭,这时我么可以使用如下方法,来避免 \5 or []5的写法。

    Pattern.quote("$5");
    
    //不使用 \\$5 or [$]5
    

    String.split()的分隔字符串为什么需要先转译

    因为在JAVA表达式中支持分隔符,如字符“|”,在JAVA中没有区分开来,
    A|B的意思是A或者B,要把斜杠“|”表示成字母,则需要转译

    需要在字符“|” 之前添加斜杠 \, 如下  \\|
    

    JAVA表达式如果匹配重复出现n次的情况

    如: ab, aabb, and aaabbb

    Pattern p = Pattern.compile("(?x)(?:a(?= a*(\\1?+b)))+\\1");
    // true
    System.out.println(p.matcher("aaabbb").matches());
    // false
    System.out.println(p.matcher("aaaabbb").matches());
    // false
    System.out.println(p.matcher("aaabbbb").matches());
    // false
    System.out.println(p.matcher("caaabbb").matches());
    

    7:如果用单个空格替换2个及以上的空格,及删除最前面空格?

    String line = " aa bbbbb ccc d ";
    // " aa bbbbb ccc d "
    System.out.println(line.replaceAll("[\\s]+", " "));
    

    8:如判断一个素数

    public static void main(String[] args) {
    // false
    System.out.println(prime(1));
    // true
    System.out.println(prime(2));
    // true
    System.out.println(prime(3));
    // true
    System.out.println(prime(5));
    // false
    System.out.println(prime(8));
    // true
    System.out.println(prime(13));
    // false
    System.out.println(prime(14));
    // false
    System.out.println(prime(15));
    }
    public static boolean prime(int n) {
    return !new String(new char[n]).matches(".?|(..+?)\\1+");
    }
    

    9:如何用分隔符分割一个字符串,并忽略逗号。

    public static void main(String[] args) {
    String line = "aaa,bbb,\"c,c\",dd;dd,\"e,e";
    List<String> toks = splitComma(line);
    for (String t : toks) {
    System.out.println("> " + t);
    }
    }
    private static List<String> splitComma(String str) {
    int start = 0;
    List<String> toks = new ArrayList<String>();
    boolean withinQuote = false;
    for (int end = 0; end < str.length(); end++) {
    char c = str.charAt(end);
    switch(c) {
    case ',':
    if (!withinQuote) {
    toks.add(str.substring(start, end));
    start = end + 1;
    }
    break;
    case '\"':
    withinQuote = !withinQuote;
    break;
    }
    }
    if (start < str.length()) {
    toks.add(str.substring(start));
    }
    return toks;
    }
    

    找到重复的内容

    String str = "123456";
    Pattern p = Pattern.compile("(\\d\\d\\d)\\1");
    Matcher m = p.matcher(str);
    System.out.println(m.groupCount());
    while (m.find()) {
    String word = m.group();
    System.out.println(word + " " + m.start() + " " + m.end());
    }
    

    找到重复一次的单词

    String pattern = "\\b(\\w+)\\b[\\w\\W]*\\b\\1\\b";
    Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
    String phrase = "unique is not duplicate but unique, Duplicate is duplicate.";
    Matcher m = p.matcher(phrase);
    while (m.find()) {
    String val = m.group();
    System.out.println("Matching subsequence is \"" + val + "\"");
    System.out.println("Duplicate word: " + m.group(1) + "\n");
    }
    

    常用的正则表达式
    正则表达式资料1
    正则表达式资料2

    正则表达式资料3
    https://github.com/ziishaned/learn-regex
    https://github.com/gedoor/learn-regex-zh

    相关文章

      网友评论

          本文标题:正则表达式 JAVA 示例

          本文链接:https://www.haomeiwen.com/subject/whtqgktx.html