聯(lián)系我們 - 廣告服務(wù) - 聯(lián)系電話:
您的當(dāng)前位置: > 關(guān)注 > > 正文

天天熱資訊!java中的正則表達(dá)式 java.util.regexJava中正則表達(dá)式的構(gòu)造

來源:CSDN 時(shí)間:2023-03-14 08:47:24

介紹

前段時(shí)間使用Java的正則表達(dá)式做一些字符串匹配的任務(wù),現(xiàn)將學(xué)到的正則表達(dá)式的知識整理成文。

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


(資料圖片)

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

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

正則表達(dá)式

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

字符

給出構(gòu)造正則表達(dá)式的常用字符

字符描述

B指定字符B

\xhh十六進(jìn)制值為oxhh的字符

\uhhhh十六進(jìn)制值為oxhhhh的Unicode字符

\ttab

\n換行

\r回車

\e轉(zhuǎn)義

字符類

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

字符類描述

. (小數(shù)點(diǎn))任意字符

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

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

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

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

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

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

\d數(shù)字0-9

\D非數(shù)字,等價(jià)于[^0-9]

\w詞字符,數(shù)字,大小寫字母,等價(jià)于[0-9a-zA-Z]

\W非詞,等價(jià)于[^\w]

邏輯操作符

組合一個(gè)或多個(gè)表達(dá)式,通過邏輯操作符實(shí)現(xiàn)。

邏輯操作符描述

XYY跟在X后面,并且XY同時(shí)滿足

X|YX或者Y

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

邊界匹配符

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

邊界匹配符描述

^一行的開始

$一行的結(jié)束

\b詞的邊界

量詞

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

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

貪婪型勉強(qiáng)型占有型描述

X?X??X?+匹配0個(gè)或1個(gè)X

X*X*?X*+匹配0個(gè)或多個(gè)X

X+X+?X++匹配1個(gè)或多個(gè)X

X{n}X{n}?X{n}+恰好匹配n個(gè)X

X{n,}X{n,}?X{n,}+至少匹配n個(gè)X

X{n,m}X{n,m}?X{n,m}+至少匹配n個(gè)X,最多匹配m個(gè)X

正則表達(dá)式使用

String

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

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

Pattern和Matcher

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

通過Pattern類的靜態(tài)方法static Pattern.compile()編譯正則表達(dá)式,利用Pattern的*matcher()*方法生產(chǎn)Matcher對象。根據(jù)Matcher對象提供的API完成相應(yīng)的操作。

我們以獲取字符串中的電話號碼和Html中的標(biāo)題為例,實(shí)現(xiàn)正則表達(dá)式的匹配。示例如下:

package com.notepad.thinkingnote.regexes;import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * Description: 正則表達(dá)式 *  * Create:      2018/8/25 21:37 * * @author Marvin Yang */public class RegexUtils {    /**     *  獲取content中全部的手機(jī)號碼     *     * @param content 待匹配內(nèi)容     * @return 電話號碼集合     */    public ListgetPhoneNumber(String content) {        ListphoneNumbers = new ArrayList<>();        Matcher matcher = PHONE_PATTERN.matcher(content);        while (matcher.find()) {            // group=2對應(yīng)(1\\d{10}), 匹配的值即為手機(jī)號碼            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;    }    /** 手機(jī)號碼 */    private static final String PHONE_REGEX = "(^|\\D)(1\\d{10})($|\\D)";    private static final Pattern PHONE_PATTERN;    /** html 標(biāo)題 */    private static final String HTML_TITLE_REGEX = "";    private static final Pattern TITLE_PATTERN;    static {        PHONE_PATTERN = Pattern.compile(PHONE_REGEX);                // 不區(qū)分大小寫        TITLE_PATTERN = Pattern.compile(HTML_TITLE_REGEX, Pattern.CASE_INSENSITIVE);    }}

構(gòu)造單測樣例如下:

package com.notepad.thinkingnote.regexes;import org.junit.Test;import java.util.Arrays;import java.util.List;import static org.junit.Assert.*;/** * Description: 正則表達(dá)式單測 *  * 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: 數(shù)字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: 數(shù)字在開頭        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: 不區(qū)分大小寫        content = "";        title = regexUtils.getHtmlTitle(content);        System.out.println(String.format("get title [%s] from content: [%s]", title, content));    }}

總結(jié)

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

參考文獻(xiàn)

責(zé)任編輯:

標(biāo)簽: 正則表達(dá)式

相關(guān)推薦:

精彩放送:

新聞聚焦
Top