聯系我們 - 廣告服務 - 聯系電話:
您的當前位置: > 關注 > > 正文

天天熱資訊!java中的正則表達式 java.util.regexJava中正則表達式的構造

來源:CSDN 時間:2023-03-14 08:47:24

介紹

前段時間使用Java的正則表達式做一些字符串匹配的任務,現將學到的正則表達式的知識整理成文。

Java中Spring.class涉及到正則表達式。如Spring.split(), matches(),replaceAll()等方法。


(資料圖片)

Java中更一般使用正則表達式的方式是利用Pattern.class和Matcher.class,所在package為java.util.regex

Java中正則表達式相關API使用不難掌握,不過重點在于編寫合適的正則表達式,尤其是利用字符類和量詞的使用。

正則表達式

Java中正則表達式與之前使用的Python是有區別的,區別在于Java對于反斜線(\)處理的不同。 在Python中"\d"表示 匹配一位數字(0-9),而Java中匹配一位數字(0-9),需要的正則表達式為"\\d"。 不過換行符和制表符只需要單反斜線“\n\t”。

字符

給出構造正則表達式的常用字符

字符描述

B指定字符B

\xhh十六進制值為oxhh的字符

\uhhhh十六進制值為oxhhhh的Unicode字符

\ttab

\n換行

\r回車

\e轉義

字符類

字符類在編寫正則表達式起到重要的作用,我們給出一些常用的構造正則表達式的字符類。

字符類描述

. (小數點)任意字符

[abc][ ] 中括號,包含a,b,c中任意字符

[^abc][ ]中括號加^, 表示否定,除a,b,c之外的

[a-z]從a到z的任意字符

[a-z&&[hi]]&&表示交集,即包含h或i

\s空白字符,包含空格,換行,回車,tab,換頁

\S大寫為小寫的取反,非空白字符,等價于[^\s]

\d數字0-9

\D非數字,等價于[^0-9]

\w詞字符,數字,大小寫字母,等價于[0-9a-zA-Z]

\W非詞,等價于[^\w]

邏輯操作符

組合一個或多個表達式,通過邏輯操作符實現。

邏輯操作符描述

XYY跟在X后面,并且XY同時滿足

X|YX或者Y

(X)() 小括號表示捕獲組(group),可以對group進行處理,尤其是獲取其中的內容

邊界匹配符

針對邊界的匹配,給出邊界匹配符。

邊界匹配符描述

^一行的開始

$一行的結束

\b詞的邊界

量詞

量詞描述了一個模式匹配文本的方式,包含

貪婪型:量詞默認是貪婪的,發現盡可能多的匹配勉強型:通過問號(?)指定,匹配最小的字符數,也稱為懶惰型,最少匹配,非貪婪。占有型:通過加號(+)指定,當用于字符串時防止匹配失敗時回溯。

貪婪型勉強型占有型描述

X?X??X?+匹配0個或1個X

X*X*?X*+匹配0個或多個X

X+X+?X++匹配1個或多個X

X{n}X{n}?X{n}+恰好匹配n個X

X{n,}X{n,}?X{n,}+至少匹配n個X

X{n,m}X{n,m}?X{n,m}+至少匹配n個X,最多匹配m個X

正則表達式使用

String

String.class提供了一些方法,如用于切分的split()方法,用于驗證是否匹配的matches()方法,用于替換操作的replaceAll方法。簡單示例如下:

/**     * String中正則表達式的測試     *     * @throws Exception 異常情況     */    @Test    public void testStringRegex() throws Exception {        // split        // 結果:[some, examples, of, regex, test]        String query = "some examples of regex test";        String[] parts = query.split(" ");        System.out.println(Arrays.toString(parts));        // matches 整個字符串是否匹配        // 結果:false        String regex = "regex";        boolean isMatched = query.matches(regex);        System.out.println(isMatched);        // replaceAll        // 結果:someexamplesofregextest        String replaceQuery = "";        String newQuery = query.replaceAll(" ", replaceQuery);        System.out.println(newQuery);    }

Pattern和Matcher

正則表達式更一般的用法是使用*java.util.regex.*下的Matcher和Pattern類。

通過Pattern類的靜態方法static Pattern.compile()編譯正則表達式,利用Pattern的*matcher()*方法生產Matcher對象。根據Matcher對象提供的API完成相應的操作。

我們以獲取字符串中的電話號碼和Html中的標題為例,實現正則表達式的匹配。示例如下:

package com.notepad.thinkingnote.regexes;import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * Description: 正則表達式 *  * Create:      2018/8/25 21:37 * * @author Marvin Yang */public class RegexUtils {    /**     *  獲取content中全部的手機號碼     *     * @param content 待匹配內容     * @return 電話號碼集合     */    public ListgetPhoneNumber(String content) {        ListphoneNumbers = new ArrayList<>();        Matcher matcher = PHONE_PATTERN.matcher(content);        while (matcher.find()) {            // group=2對應(1\\d{10}), 匹配的值即為手機號碼            phoneNumbers.add(matcher.group(2));        }        return phoneNumbers;    }    /**     * 從Html中獲取title     *     * @param content a html     * @return the title of a html     */    public String getHtmlTitle(String content) {        Matcher matcher = TITLE_PATTERN.matcher(content);        return matcher.find()? matcher.group(1):null;    }    /** 手機號碼 */    private static final String PHONE_REGEX = "(^|\\D)(1\\d{10})($|\\D)";    private static final Pattern PHONE_PATTERN;    /** html 標題 */    private static final String HTML_TITLE_REGEX = "";    private static final Pattern TITLE_PATTERN;    static {        PHONE_PATTERN = Pattern.compile(PHONE_REGEX);                // 不區分大小寫        TITLE_PATTERN = Pattern.compile(HTML_TITLE_REGEX, Pattern.CASE_INSENSITIVE);    }}

構造單測樣例如下:

package com.notepad.thinkingnote.regexes;import org.junit.Test;import java.util.Arrays;import java.util.List;import static org.junit.Assert.*;/** * Description: 正則表達式單測 *  * Create:      2018/8/25 21:45 * * @author Marvin Yang */public class RegexUtilsTest {    private RegexUtils regexUtils = new RegexUtils();    @Test    public void getPhoneNumber() {        // test 1: 有電話號碼        String content = "緊急情況請撥打13845697569";        ListphoneNumbers = regexUtils.getPhoneNumber(content);        System.out.println(String.format("[%s] has phone number : [%s]", content, phoneNumbers));        // test 2: 數字12位        content = "緊急情況請撥打138456975690";        phoneNumbers = regexUtils.getPhoneNumber(content);        System.out.println(String.format("[%s] has phone number : [%s]", content, phoneNumbers));        // test 3: 開頭不是1        content = "緊急情況請撥打23845697569";        phoneNumbers = regexUtils.getPhoneNumber(content);        System.out.println(String.format("[%s] has phone number : [%s]", content, phoneNumbers));        // test 4: 數字在開頭        content = "13845697569緊急情況請撥打";        phoneNumbers = regexUtils.getPhoneNumber(content);        System.out.println(String.format("[%s] has phone number : [%s]", content, phoneNumbers));    }    @Test    public void getHtmlTitle() throws Exception {        // test 1: 正常情況        String content = "";        String title = regexUtils.getHtmlTitle(content);        System.out.println(String.format("get title [%s] from content: [%s]", title, content));        // test 1: 不區分大小寫        content = "";        title = regexUtils.getHtmlTitle(content);        System.out.println(String.format("get title [%s] from content: [%s]", title, content));    }}

總結

本文對Java的正則表達式的使用進行了簡單的介紹,已經利用Pattern和Matcher進行匹配的樣例。當然重要的還是正則表達式的編寫,不一定非得很復雜, 重點是適合我們處理的問題。

參考文獻

責任編輯:

標簽: 正則表達式

相關推薦:

精彩放送:

新聞聚焦
Top 岛国精品在线