国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

56從零開(kāi)始學(xué)Java之與字符串相關(guān)的正則表達(dá)式

這篇具有很好參考價(jià)值的文章主要介紹了56從零開(kāi)始學(xué)Java之與字符串相關(guān)的正則表達(dá)式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

作者:孫玉昌,昵稱(chēng)【一一哥】,另外【壹壹哥】也是我哦

CSDN博客專(zhuān)家、萬(wàn)粉博主、阿里云專(zhuān)家博主、掘金優(yōu)質(zhì)作者

前言

在上一篇文章中,壹哥給大家介紹了String字符串及其各種常用API方法,接下來(lái)壹哥繼續(xù)給大家講解一些String字符串的高級(jí)玩法。

有時(shí)候我們操作一個(gè)字符串時(shí),這個(gè)字符串的內(nèi)容并不一定就是固定不變的。比如在用戶注冊(cè)時(shí),我們要求用戶在輸入框中輸入自己的手機(jī)號(hào)碼。我們知道,每個(gè)人的手機(jī)號(hào)碼都是不一樣的,那我們?cè)撊绾伪WC用戶輸入的是合法的手機(jī)號(hào)呢?這就需要我們?cè)诖a中對(duì)這個(gè)手機(jī)號(hào)進(jìn)行驗(yàn)證審核,不能隨便輸入11位數(shù)字就行了。這時(shí),就需要對(duì)用戶傳遞過(guò)來(lái)的字符串參數(shù)進(jìn)行校驗(yàn)。

作為一個(gè)程序員,你可能會(huì)想到通過(guò)一段代碼程序來(lái)進(jìn)行判斷,但這種方法需要?jiǎng)?chuàng)建對(duì)應(yīng)的判斷規(guī)則,然后用一堆的代碼進(jìn)行實(shí)現(xiàn),比如:

boolean isValidMobileNumber(String s) {
    // 是否是11位?
    if (s.length() != 11) {
        return false;
    }
    // 每一位都是0~9:
    for (int i=0; i<s.length(); i++) {
        char c = s.charAt(i);
        if (c < '0' || c > '9') {
            return false;
        }
    }
    return true;
}

但上面的代碼只是做了非常粗略的判斷,并未考慮首位數(shù)字不能為0等更詳細(xì)的情況,而且以后隨著發(fā)展,可能手機(jī)號(hào)不只有11位,或者會(huì)有其他的規(guī)則。那時(shí)候再修改代碼嗎?這就很麻煩!

實(shí)際上,在開(kāi)發(fā)時(shí),如果我們想實(shí)現(xiàn)該功能,比較普遍且靠譜的做法,是利用正則表達(dá)式來(lái)進(jìn)行實(shí)現(xiàn)。那么什么是正則表達(dá)式?它有哪些特點(diǎn)?怎么用?接下來(lái)就請(qǐng)大家跟隨壹哥來(lái)學(xué)習(xí)今天的內(nèi)容吧。

----------------------------------------------前戲已做完,精彩即開(kāi)始--------------------------------------------

全文大約【6000】字,不說(shuō)廢話,只講可以讓你學(xué)到技術(shù)、明白原理的純干貨!本文帶有豐富的案例及配圖視頻,讓你更好地理解和運(yùn)用文中的技術(shù)概念,并可以給你帶來(lái)具有足夠啟迪的思考......

配套開(kāi)源項(xiàng)目資料

Github:

https://github.com/SunLtd/LearnJava

Gitee:

一一哥/從零開(kāi)始學(xué)Java

一. 正則表達(dá)式

1. 簡(jiǎn)介

有挺多小伙伴之前聽(tīng)說(shuō)過(guò)正則表達(dá)式,覺(jué)得這是一個(gè)很牛逼、很神奇的知識(shí)點(diǎn),所以隱隱地覺(jué)得正則表達(dá)式學(xué)起來(lái)也會(huì)比較難。實(shí)際上,正則表達(dá)式的學(xué)習(xí)并不難!它其實(shí)是一種非常實(shí)用且簡(jiǎn)單的字符串操作工具,主要是作為匹配字符串的模板,能夠?qū)⒛硞€(gè)字符模式與所搜索的字符串進(jìn)行對(duì)比匹配,并且正則表達(dá)式只是一套標(biāo)準(zhǔn)規(guī)范,和具體的某種開(kāi)發(fā)語(yǔ)言并沒(méi)有關(guān)系。也就是說(shuō),正則表達(dá)式不是java、python等某個(gè)語(yǔ)言獨(dú)有的,而是在各種語(yǔ)言中都通用的,只是在每種語(yǔ)言中可能會(huì)有個(gè)別細(xì)微的差別。

而在正式開(kāi)始學(xué)習(xí)正則表達(dá)式之前,讓我們先來(lái)了解一下正則表達(dá)式的概念:

正則表達(dá)式是由各種普通的字符(如a~z、A~Z、0~9),以及一些特殊字符(元字符)組成的文字模板,是一種用于模式匹配和替換的規(guī)范。通俗地說(shuō),我們可以把正則表達(dá)式理解成是一種可以對(duì)字符串進(jìn)行各種特殊處理的工具,比如可以對(duì)字符串進(jìn)行【查找、提取、分割、替換】等操作。

也即是說(shuō),正則表達(dá)式只是一個(gè)描述規(guī)則的字符串。所以,只需要編寫(xiě)出正確的規(guī)則,我們就可以讓正則表達(dá)式去判斷目標(biāo)字符串是否符合規(guī)則。比如"Hello World"這樣的字符串也是一個(gè)正則表達(dá)式,它可以匹配 "Hello World"這個(gè)字符串。一個(gè)【點(diǎn)號(hào)】也是一個(gè)正則表達(dá)式,它可以匹配任意一個(gè)字符,如"a" 、"A"、"1"等。

2. 基本語(yǔ)法

知道了正則表達(dá)式的基本概念之后,接下來(lái)我們還需要了解它的一些基本語(yǔ)法及其含義。以下是開(kāi)發(fā)時(shí)常用的正則表達(dá)式基本語(yǔ)法,各種復(fù)雜的正則表達(dá)式其實(shí)都是由這些基本的語(yǔ)法規(guī)則組成的。大家要注意,正則表達(dá)式的匹配規(guī)則都是按照從左到右進(jìn)行匹配的,并且通過(guò)不同的符號(hào)組合,可以實(shí)現(xiàn)對(duì)字符串的精確匹配、模糊匹配,也可以匹配字母、數(shù)字、各種符號(hào)等。

字符

說(shuō)明

()

標(biāo)記子表達(dá)式的開(kāi)始和結(jié)束位置。要匹配這些字符,請(qǐng)使用\(和\)

[]

用于確定中括號(hào)表達(dá)式的開(kāi)始和結(jié)束位置。要匹配這些字符,請(qǐng)使用\[和\]

{}

用于標(biāo)記前面子表達(dá)式的出現(xiàn)頻度。要匹配這些字符,請(qǐng)使用\{和\}

\

代表轉(zhuǎn)義字符,將下個(gè)一字符標(biāo)記為特殊字符、文本、反向引用或八進(jìn)制轉(zhuǎn)義符。例如, n匹配字符 n,\n 匹配換行符,序列 \\\\ 匹配 \\\\( 匹配 (。

|

指定兩項(xiàng)之間任選一項(xiàng)。如果要匹配丨字符本身,請(qǐng)使用\|

^

表示否定,例如[^abc]表示非 a、b、c 的任意字符;[^a-f]表示不是 a~f 范圍內(nèi)的任意字符

$

匹配輸入字符串結(jié)尾的位置。如果設(shè)置了 RegExp 對(duì)象的 Multiline 屬性,$ 還會(huì)與"\n"或"\r"之前的位置匹配。

*

表示零次或多次匹配前面的字符或子表達(dá)式。例如,zo* 匹配"z"和"zoo",* 等同于 {0,}。

+

表示一次或多次匹配前面的字符或子表達(dá)式。例如,"zo+"與"zo"和"zoo"匹配,但與"z"不匹配。+ 等效于 {1,}。

?

表示零次或一次匹配前面的字符或子表達(dá)式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。

&&,“與”運(yùn)算:

例如 [a-z&&[def]],是 a~z 和 [def] 的交集,表示 d、e;
f[a-z&&^bc]]是 a~z 范圍內(nèi)除 b 和 c 之外的所有字符;
[ad-z] [a-z&&[m-p]]是 a~z 范圍內(nèi)除 m~p 范圍之外的字符的所有字符

“并”運(yùn)算

并運(yùn)算與前面的枚舉類(lèi)似,例如[a-d[m-p]]表示 [a-dm-p]

{n}

n 是非負(fù)整數(shù),表示正好匹配 n 次。例如,"o{2}"與"Bob"中的"o"不匹配,但與"food"中的兩個(gè)"o"匹配。

{n,}

n 是非負(fù)整數(shù),表示至少匹配 n 次。例如,"o{2,}"不匹配"Bob"中的"o",而匹配"foooood"中的所有 o。"o{1,}"等效于"o+"。"o{0,}"等效于"o*"。

{n,m}

mn 是非負(fù)整數(shù),其中 n <= m,表示匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的頭三個(gè) o。'o{0,1}' 等效于 'o?'。注意,逗號(hào)和數(shù)字之間不能有空格。

?

當(dāng)此字符緊隨任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后時(shí),匹配模式是"非貪心的"。"非貪心的"模式表示匹配搜索到盡可能短的字符串,而默認(rèn)"貪心的"模式則會(huì)匹配搜索到盡可能長(zhǎng)的字符串。例如,在字符串"oooo"中,"o+?"只匹配單個(gè)"o",而"o+"匹配所有"o"。

.

代表除"\r\n"之外的任何單個(gè)字符。若要匹配包括"\r\n"在內(nèi)的任意字符,請(qǐng)使用諸如"[\s\S]"之類(lèi)的模式。

(pattern)

代表pattern,并捕獲與之匹配的子表達(dá)式??梢允褂?$0…$9 屬性,從"匹配"集合中檢索捕獲的匹配。若要匹配括號(hào)字符 ( ),請(qǐng)使用"\("或者"\)"。

(?:pattern)

代表pattern,但不捕獲與之匹配的子表達(dá)式,即它是一個(gè)非捕獲匹配,不存儲(chǔ)供以后使用的匹配。這對(duì)用"or"字符 (|) 組合模式部件的情況很有用,例如,'industr(?:y|ies) 是比 'industry|industries' 更經(jīng)濟(jì)的表達(dá)式。

(?=pattern)

執(zhí)行正向預(yù)測(cè)先行搜索的子表達(dá)式,該表達(dá)式匹配處于匹配 pattern 的字符串的起始點(diǎn)的字符串。它是一個(gè)非捕獲匹配,即不能捕獲供以后使用的匹配。例如,'Windows (?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。預(yù)測(cè)先行不占用字符,即發(fā)生匹配后,下一匹配的搜索緊隨上一匹配之后,而不是在組成預(yù)測(cè)先行的字符后。

(?!pattern)

執(zhí)行反向預(yù)測(cè)先行搜索的子表達(dá)式,該表達(dá)式匹配不處于匹配 pattern 的字符串的起始點(diǎn)的搜索字符串。它是一個(gè)非捕獲匹配,即不能捕獲供以后使用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows",但不匹配"Windows 2000"中的"Windows"。預(yù)測(cè)先行不占用字符,即發(fā)生匹配后,下一匹配的搜索緊隨上一匹配之后,而不是在組成預(yù)測(cè)先行的字符后。

x|y

代表 xy。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"。

X

字符x(x代表任何合法的字符)

[xyz]

字符集。匹配包含的任一指定字符。例如,"[abc]"匹配"plain"中的"a"。

[^xyz]

代表反向字符集。匹配未包含在指定字符集的任何字符。例如,"[^abc]"可以匹配"plain"中"p","l","i","n"。

[a-z]

枚舉字符范圍,匹配指定范圍內(nèi)的任何字符。例如"[a-z]",用于匹配"a"到"z"范圍內(nèi)的任何小寫(xiě)字母。

[^a-z]

反向范圍字符,匹配不在指定范圍內(nèi)的任何字符。例如,"[^a-z]"匹配所有不在"a"到"z"范圍內(nèi)的任何字符。

\b

匹配一個(gè)字邊界,即字與空格間的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。

\B

代表非字邊界。"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。

\cx

匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回車(chē)符。x 的值必須在 A-Z 或 a-z 之間。如果不是這樣,則假定 c 就是"c"字符本身。

\d

d即digit,代表數(shù)字字符,等效于 [0-9]。

\D

代表非數(shù)字字符,等效于 [^0-9]。

\f

代表?yè)Q頁(yè)符,等效于 \x0c 和 \cL。

\n

代表?yè)Q行符,等效于 \x0a 和 \cJ。

\r

代表一個(gè)回車(chē)符,等效于 \x0d 和 \cM。

\s

s即space,代表任何空白字符,包括空格、制表符、換頁(yè)符等。與 [ \f\n\r\t\v] 等效。

\S

代表任何非空白字符,與 [^ \f\n\r\t\v] 等效。

\t

代表制表符,與 \x09 和 \cI 等效。

\v

代表垂直制表符,與 \x0b 和 \cK 等效。

\w

w即word,代表任何字類(lèi)字符,包括下劃線。與"[A-Za-z0-9_]"等效。

\W

代表任何非單詞字符,與"[^A-Za-z0-9_]"等效。

\xn

代表n,此處的 n 是一個(gè)十六進(jìn)制轉(zhuǎn)義碼。十六進(jìn)制轉(zhuǎn)義碼必須正好是兩位數(shù)長(zhǎng)。例如,"\x41"匹配"A"。"\x041"與"\x04"&"1"等效。允許在正則表達(dá)式中使用 ASCII 代碼。

\num

代表num,此處的 num 是一個(gè)正整數(shù)。到捕獲匹配的反向引用。例如,"(.)\1"匹配兩個(gè)連續(xù)的相同字符。

\n

標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義碼或反向引用。如果 \n 前面至少有 n 個(gè)捕獲子表達(dá)式,那么 n 是反向引用。否則,如果 n 是八進(jìn)制數(shù) (0-7),那么 n 是八進(jìn)制轉(zhuǎn)義碼。

\nm

標(biāo)識(shí)一個(gè)八進(jìn)制轉(zhuǎn)義碼或反向引用。如果 \nm 前面至少有 nm 個(gè)捕獲子表達(dá)式,那么 nm 是反向引用。如果 \nm 前面至少有 n 個(gè)捕獲,則 n 是反向引用,后面跟有字符 m。如果兩種前面的情況都不存在,則 \nm 匹配八進(jìn)制值 nm,其中 n m 是八進(jìn)制數(shù)字 (0-7)。

\nml

當(dāng) n 是八進(jìn)制數(shù) (0-3),ml 是八進(jìn)制數(shù) (0-7) 時(shí),匹配八進(jìn)制轉(zhuǎn)義碼 nml。

\un

代表n,其中 n 是以四位十六進(jìn)制數(shù)表示的 Unicode 字符。例如,\u00A9 匹配版權(quán)符號(hào) (?)。

有的小伙伴會(huì)說(shuō),上面這么多的規(guī)則,我記不住啊!其實(shí)大家不用擔(dān)心,我們沒(méi)必要把以上這些規(guī)則都記住,只需記住幾個(gè)常用的語(yǔ)法規(guī)則,以后開(kāi)發(fā)時(shí)如果需要編寫(xiě)正則表達(dá)式,隨時(shí)查閱API就可以了。而且現(xiàn)在網(wǎng)上也有很多第三方的正則表達(dá)式編寫(xiě)網(wǎng)站,很多常用的表達(dá)式都已經(jīng)寫(xiě)好了,我們只需要將這些規(guī)則直接拿來(lái)用即可。但是我們需要知道基本的規(guī)則,這樣當(dāng)有特殊需要時(shí)才能靈活修改組合,滿足我們的特殊需求。

當(dāng)然,我們?cè)陂_(kāi)發(fā)時(shí)編寫(xiě)的正則表達(dá)式,并不會(huì)像上表中展示的那樣簡(jiǎn)單,可能是很復(fù)雜。但不管如何,這些復(fù)雜的表達(dá)式,都是由這些基本的語(yǔ)法規(guī)則組成的,我們了解這些基本規(guī)則即可。

3. 常用API

3.1 String中的正則表達(dá)式操作方法

為了讓我們方便操作正則表達(dá)式,String類(lèi)給我們提供了如下幾個(gè)API方法,可以讓我們結(jié)合正則表達(dá)式對(duì)字符串進(jìn)行各種操作:

  • boolean matches(String regex):判斷該字符串是否匹配了指定的正則表達(dá)式;
  • String replaceAll(String regex, String replacement):將該字符串中所有匹配了regex規(guī)則的子串都替換成replacement;
  • String replaceFirst(String regex, String replacement):將該字符串中第一個(gè)匹配regex規(guī)則的子串替換成replacement;
  • String[] split(String regex):以regex作為分隔符,把該字符串分割成多個(gè)子串。

以上API方法的使用格式如下所示:

//正則表達(dá)式
String reg = "a*c";
//對(duì)某個(gè)字符串進(jìn)行匹配判斷
boolean result="abc".matches(reg);

//利用正則表達(dá)式對(duì)字符串進(jìn)行替換,把用不規(guī)范的連續(xù)空格分隔的句子變成規(guī)范的句子
String s = "The     fast\t\t snow   down   on the  land cat.";
String r = s.replaceAll("\\s+", " ");

3.2 正則表達(dá)式相關(guān)的操作類(lèi)

上面這些方法都是Java提供的用于操作正則表達(dá)式的API方法,另外在java.util.regex包中也提供了以下三個(gè)可以操作正則表達(dá)式的類(lèi):

  • Pattern類(lèi):Pattern對(duì)象是正則表達(dá)式編譯后在內(nèi)存中的表示形式,因此正則表達(dá)式字符串必須先被編譯為 Pattern對(duì)象,然后再利用該 Pattern對(duì)象創(chuàng)建對(duì)應(yīng)的Matcher對(duì)象。執(zhí)行匹配所涉及的狀態(tài)保留在Matcher對(duì)象中,多個(gè)Matcher對(duì)象可共享同一個(gè)Pattern對(duì)象。Pattern類(lèi)沒(méi)有公共的構(gòu)造方法。如果我們想要?jiǎng)?chuàng)建Pattern對(duì)象,可以調(diào)用其公共的靜態(tài)方法compile(),它會(huì)返回一個(gè)Pattern對(duì)象,且該方法要接受一個(gè)正則表達(dá)式作為它的第一個(gè)參數(shù)。
  • Matcher類(lèi):Matcher類(lèi)是對(duì)輸入的字符串進(jìn)行解釋和匹配操作的引擎,該類(lèi)也沒(méi)有公共的構(gòu)造方法,我們可以通過(guò)Pattern對(duì)象的matcher()方法來(lái)獲得一個(gè)Matcher對(duì)象。
  • PatternSyntaxException類(lèi):PatternSyntaxException是一個(gè)非強(qiáng)制的異常類(lèi),它可以表示在正則表達(dá)式中出現(xiàn)的語(yǔ)法異常。

以上API類(lèi)的使用格式如下所示:

//將一個(gè)正則表達(dá)式字符串編譯成Pattern對(duì)象
Pattern p = Pattern.compile("某個(gè)正則表達(dá)式,如a*b");

//使用Pattern對(duì)象創(chuàng)建Matcher對(duì)象,匹配某個(gè)字符串
Matcher m = p.matcher("abbbb");

//返回匹配結(jié)果,此處會(huì)返回true
boolean b = m.matches(); 

二. 基本使用

了解了以上這些基礎(chǔ)內(nèi)容之后,接下來(lái)壹哥再通過(guò)幾個(gè)實(shí)際案例,來(lái)帶大家綜合運(yùn)用一下上面的內(nèi)容。

1. 驗(yàn)證電話號(hào)碼

我們?cè)谠L問(wèn)網(wǎng)站或APP時(shí),經(jīng)常會(huì)需要我們通過(guò)手機(jī)號(hào)來(lái)注冊(cè)個(gè)會(huì)員,這時(shí)就需要我們輸入電話號(hào)碼。這個(gè)電話號(hào)碼包括手機(jī)號(hào)碼或者固定電話兩種情況,兩者的格式有點(diǎn)不同。但不管怎么樣,網(wǎng)站或APP都會(huì)驗(yàn)證用戶輸入的電話號(hào)碼是否合法,否則就會(huì)給用戶一些提示。接下來(lái)壹哥就給大家設(shè)計(jì)一個(gè)驗(yàn)證電話號(hào)碼是否合法的案例,通過(guò)本案例來(lái)綜合練習(xí)一下前面學(xué)習(xí)過(guò)的內(nèi)容。

1.1 正則表達(dá)式

壹哥直接給大家貼出了如下正則表達(dá)式,該正則表達(dá)式就可以用于驗(yàn)證電話號(hào)碼是否合法。

String regex = "0\\d{2,3}[-]?\\d{7,8}|0\\d{2,3}\\s?\\d{7,8}|18[0-9]\\d{8}|15[1234]\\d{8}";

接下來(lái)壹哥再給大家解釋一下該表達(dá)式的含義。

1.1.1 匹配固定電話
  • 首先電話號(hào)碼包括固定電話和手機(jī)號(hào)碼,其中固定電話由區(qū)號(hào)和號(hào)碼組成,手機(jī)號(hào)目前是11位純數(shù)字;
  • 固話的區(qū)號(hào)部分,以 0 開(kāi)頭,后面是 2~3 位數(shù),因此在匹配區(qū)號(hào)時(shí)可以使用0\d{2,3}這個(gè)正則表達(dá)式;
  • 固話的號(hào)碼部分由 7~8 位數(shù)字組成,因此可以使用\d{7,8}表達(dá)式來(lái)進(jìn)行匹配;
  • 又因?yàn)楣潭娫挼慕M合方式可能是“區(qū)號(hào)-號(hào)碼” 或 “區(qū)號(hào)號(hào)碼”,因此匹配固定電話號(hào)碼時(shí),可以使用“0\\d{2,3}[-]?\\d{7,8}|0\\d{2,3}\\s?\\d{7,8}”表達(dá)式。
1.1.2 匹配手機(jī)號(hào)碼
  • 手機(jī)號(hào)碼是11位純數(shù)字,一般以數(shù)字“1x”開(kāi)頭,但不同運(yùn)營(yíng)商的手機(jī)號(hào)開(kāi)頭并不相同。
  • 考慮到手機(jī)號(hào)碼的特殊性,本案例只給大家示范18xxxxxxxxx和15xxxxxxxxx號(hào)段的手機(jī)號(hào),我們可以使用“18[0-9]\\d{8}|15[1234]\\d{8}”這個(gè)表達(dá)式進(jìn)行匹配。
  • 該正則表達(dá)式會(huì)驗(yàn)證以18或15開(kāi)頭的手機(jī)號(hào)碼,且15開(kāi)頭的手機(jī)號(hào)碼,第3位數(shù)字只能是1、2、3、4中的一個(gè)。

1.2 代碼實(shí)現(xiàn)

分析完了電話號(hào)碼的正則表達(dá)式,我們?cè)倏纯慈绾卧贘ava代碼中進(jìn)行實(shí)現(xiàn)。

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

/**
* @author 一一哥Sun
*/
public class Demo11 {

    public static void main(String[] args) {
        //定義一個(gè)用于匹配電話號(hào)碼的正則表達(dá)式
        String regex = "0\\d{2,3}[-]?\\d{7,8}|0\\d{2,3}\\s?\\d{7,8}|18[0-9]\\d{8}|15[1234]\\d{8}";

        //定義一個(gè)結(jié)束循環(huán)的標(biāo)志位
        String flag = "Y";

        do {
            System.out.print("請(qǐng)輸入電話號(hào)碼:");
            // 接收用戶在控制臺(tái)輸入的電話號(hào)碼
            Scanner scan = new Scanner(System.in);
            String phone = scan.next();    

            // 編譯正則表達(dá)式
            Pattern pattern = Pattern.compile(regex);   
            // 創(chuàng)建給定輸入模式的匹配器
            Matcher matcher = pattern.matcher(phone); 
            //進(jìn)行字符串的匹配
            boolean bool = matcher.matches();
            
            if(bool) { // 如果驗(yàn)證通過(guò)
                System.out.println("電話號(hào)碼格式可用");
            } else {
                System.out.println("電話號(hào)碼不可用,請(qǐng)重新輸入!");
            }

            System.out.print("是否繼續(xù)注冊(cè)?(請(qǐng)輸入 Y/N 或 y/n)");
            flag=scan.next();
        }while(flag.equalsIgnoreCase("Y"));

        System.out.println("注冊(cè)結(jié)束!");
    }
}

在本案例中,我們使用 do…while 語(yǔ)句進(jìn)行循環(huán)判斷,接收用戶在控制臺(tái)輸入的電話號(hào)碼,接著通過(guò)Pattern類(lèi)進(jìn)行編譯,創(chuàng)建給定輸入模式的匹配器,調(diào)用 matches()方法返回匹配的結(jié)果。如果結(jié)果為true,則表示驗(yàn)證通過(guò);如果為false,則表示驗(yàn)證失敗。最后再通過(guò)輸入Y或N來(lái)判斷是否結(jié)束循環(huán)。

2. 驗(yàn)證身份證號(hào)

2.1 身份證規(guī)則簡(jiǎn)介

我們知道,目前國(guó)內(nèi)的二代身份證一般都是18位的,但因?yàn)闅v史遺留原因,還有個(gè)別一代身份證號(hào)碼可能是15位的。一般18位或15位的身份證號(hào)碼格式如下:

  • 十八位號(hào)碼:xxxxxx yyyy MM dd 375 0
  • 十五位號(hào)碼:xxxxxx yy MM dd 75 0

其中,身份證包含地區(qū)、日期、特殊字符來(lái)組成,一般的組成規(guī)則如下:

  • 地區(qū)是6位的純數(shù)字:[1-9][0-9]{5};
  • 年份的前兩位目前只能是18、19、20:(18|19|20) ,表示18-20;
  • 年份的后兩位可以是0-9之間的數(shù)字: [0-9]{2} 即00-99;
  • 月份只有12個(gè):((0[1-9])|(10|11|12)) ,即01-12;
  • 天數(shù),最多到31:(([0-2][1-9])|10|20|30|31) ,即1-31,這里無(wú)法對(duì)二月份特殊處理;
  • 18位身份證后三位的順序碼:[0-9]{3},即000-999;
  • 15位身份證后兩位的順序碼:[0-9]{2},即00-99;
  • 最后的校驗(yàn)碼:15位身份證號(hào)的是[0-9] ,18位身份證號(hào)的則是([0-9]|(X|x)),只有18位的才會(huì)出現(xiàn)Xx。

2.2 正則表達(dá)式

根據(jù)上面的規(guī)則分析,我們就可以設(shè)計(jì)出身份證號(hào)碼對(duì)應(yīng)的正則表達(dá)式。

//18位號(hào)碼
String id_18="^[1-9][0-9]{5}(18|19|20)[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}([0-9]|(X|x))";

//15位號(hào)碼
String id_15="^[1-9][0-9]{5}[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{2}[0-9]";

2.3 代碼實(shí)現(xiàn)

接下來(lái)我們就在Java代碼中,對(duì)身份證號(hào)進(jìn)行驗(yàn)證,看看是否合法。

public class Demo13 {

	public static void main(String[] args) {
		//18位號(hào)碼的正則表達(dá)式
		String reg18 = "^[1-9][0-9]{5}(18|19|20)[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{3}([0-9]|(X|x))";

		//15位號(hào)碼的正則表達(dá)式
		String reg15 = "^[1-9][0-9]{5}[0-9]{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)[0-9]{2}[0-9]";

		//編譯正則表達(dá)式
		String validStr = "(" + reg18 + ")" + "|" + "(" + reg15 + ")";
		Pattern pattern = Pattern.compile(validStr);

		//匹配身份證號(hào)是否合法,請(qǐng)?jiān)谶@里傳入自己18/15位的身份證號(hào)
		Matcher matcher = pattern.matcher("140826198812190122");

		System.out.println("身份證號(hào)是否合法:"+matcher.matches());
	}

}

-----------------------------------------------正片已結(jié)束,來(lái)根事后煙---------------------------------------------

三. 結(jié)語(yǔ)

至此,壹哥就把正則表達(dá)式給大家簡(jiǎn)單地介紹完了,今天的重點(diǎn)內(nèi)容如下:

  • 掌握正則表達(dá)式的基本語(yǔ)法規(guī)則;
  • 掌握J(rèn)ava代碼中使用正則表達(dá)式;
  • 了解幾個(gè)常用的正則表達(dá)式匹配規(guī)則,比如手機(jī)號(hào)、身份證號(hào)等的驗(yàn)證;

另外如果你獨(dú)自學(xué)習(xí)覺(jué)得有很多困難,可以加入壹哥的學(xué)習(xí)互助群,大家一起交流學(xué)習(xí)。

四. 今日作業(yè)

作業(yè)1:

在正則表達(dá)式中,*、+、?三個(gè)符號(hào)有什么區(qū)別?請(qǐng)?jiān)谠u(píng)論區(qū)說(shuō)出你的答案。

作業(yè)2:

請(qǐng)?jiān)O(shè)計(jì)一個(gè)正則表達(dá)式,驗(yàn)證一個(gè)電子郵箱格式是否合法。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-634687.html

到了這里,關(guān)于56從零開(kāi)始學(xué)Java之與字符串相關(guān)的正則表達(dá)式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Day56 | 583. 兩個(gè)字符串的刪除操作 | 72. 編輯距離

    583. 兩個(gè)字符串的刪除操作 注意點(diǎn): 1.當(dāng)word1[i - 1] 與 word2[j - 1]不相同的時(shí)候, 情況一:刪word1[i - 1],最少操作次數(shù)為dp[i - 1][j] + 1 情況二:刪word2[j - 1],最少操作次數(shù)為dp[i][j - 1] + 1 情況三:同時(shí)刪word1[i - 1]和word2[j - 1],操作的最少次數(shù)為dp[i - 1][j - 1] + 2 因?yàn)?dp[i][j-1]+1 = d

    2024年02月08日
    瀏覽(21)
  • 代碼隨想錄打卡第56天|583. 兩個(gè)字符串的刪除操作;72. 編輯距離

    583. 兩個(gè)字符串的刪除操作 關(guān)鍵點(diǎn)1:dp數(shù)組的含義 dp[i][j],使得以i-1為結(jié)尾word1 和 以j-1為結(jié)尾的word2 相同所需的最小步數(shù); 關(guān)鍵點(diǎn)2:遞歸公式的推導(dǎo) if(nums1[i-1] == nums2[j-1]),則i和j同時(shí)移動(dòng),所以為i-1,j-1;dp[i][j] = dp[i-1][j-1];由于不需要進(jìn)行刪除操作,所以不需要加1 如果不相

    2023年04月19日
    瀏覽(34)
  • 算法-回溯相關(guān)問(wèn)題-生成所有n位長(zhǎng)的二進(jìn)制字符串 Java版

    生成所有n位長(zhǎng)的二進(jìn)制字符串。假設(shè)A[0…n-1]是一個(gè)大小為n的數(shù)組。

    2024年02月16日
    瀏覽(19)
  • Python 從字符串開(kāi)始匹配

    從字符串開(kāi)始匹配單個(gè)字符串 從字符串開(kāi)始匹配多個(gè)字符串,匹配字符串以 元祖 的形式存儲(chǔ) re.match() 從字符串的開(kāi)始進(jìn)行匹配 Try to apply the pattern at the start of the string, returning a Match object, or None if no match was found. 注意: re.match() 的結(jié)果是對(duì)象,需要 .group() 獲得匹配結(jié)果 re.s

    2024年02月13日
    瀏覽(21)
  • python字符串相關(guān)

    reverse() 函數(shù)用于反向 列表中 元素。 reverse()方法語(yǔ)法: seq — 需要轉(zhuǎn)換的序列,如元組、列表、字符串、range 可惜 不能反轉(zhuǎn)字符串 語(yǔ)法: \\\'sep\\\'.join(sep_object) 參數(shù)說(shuō)明 sep:分割符,可為“,、;”等。 sep_object:分割對(duì)象,可為字符串、以及儲(chǔ)存字符串的元組、列表、字典。

    2024年02月09日
    瀏覽(52)
  • 【C#】字符串拼接相關(guān)

    【C#】字符串拼接相關(guān)

    目錄 1.字符串拼接方式1 用+號(hào)進(jìn)行字符串拼接 復(fù)合運(yùn)算符 += 2.字符串拼接方式2 3.控制臺(tái)打印拼 4.例子? 之前的算數(shù)運(yùn)算符 只是用來(lái)數(shù)值類(lèi)型變量進(jìn)行數(shù)學(xué)運(yùn)算的 而 string 不存在算數(shù)運(yùn)算符 不能計(jì)算 但是可以通過(guò)+號(hào)來(lái)進(jìn)行字符串拼接 用+號(hào)進(jìn)行字符串拼接 復(fù)合運(yùn)算符 += 按數(shù)

    2024年02月04日
    瀏覽(23)
  • JavaScript:字符串的相關(guān)方法

    字符串的所有實(shí)例方法,都可以通過(guò)基本數(shù)據(jù)類(lèi)型字符串去調(diào)用 字符串其本質(zhì)就是一個(gè)字符數(shù)組 str.length 獲取字符串的長(zhǎng)度 str[index] 獲取指定位置的字符 endsWith() - 檢查字符串是否以指定內(nèi)容結(jié)束 startsWith() - 檢查字符串是否以指定內(nèi)容開(kāi)始 練習(xí)1: 獲取用戶輸入的任意字符串

    2024年01月16日
    瀏覽(29)
  • 字符串相關(guān)高頻面試題算法

    一、字符串 java:String內(nèi)置類(lèi)型,不可更改。(如需更改可考慮:StringBuffer, StringBuilder,char[]等) 二、歸類(lèi) 字符串涉及到的相關(guān)題型通常會(huì)是以下幾個(gè)方面: 概念理解:字典序 簡(jiǎn)單操作:插入刪除字符、旋轉(zhuǎn) 規(guī)則判斷(羅馬數(shù)字轉(zhuǎn)換 是否是合法的整數(shù)、浮點(diǎn)數(shù)) 數(shù)字運(yùn)算(

    2024年02月09日
    瀏覽(26)
  • Windows BAT批處理字符串相關(guān)操作(字符串定義、分割、拼接、替換、切片、查找)

    使用 set 來(lái)定義字符串 代碼說(shuō)明: 將字符串Hello賦值給string1的變量 使用 %string1%%string2% 的方式完成字符串的拼接。 代碼說(shuō)明: 用來(lái)連接字符串的字符串,如果包含了特殊字符則需要使用 ^ 轉(zhuǎn)義,并且需要使用 \\\"\\\" 括起來(lái),特殊字符包括(但不限于): 符號(hào) 作用 @ 命令行回顯

    2024年02月12日
    瀏覽(29)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包