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

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

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

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

前言

在上一篇文章中給大家介紹了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)容吧。


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

一. 正則表達(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匹配換行符,序列\(zhòng)\匹配\,\(匹配(。
指定兩項(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)算與前面的枚舉類似,例如[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} m和n是非負(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]"之類的模式。
(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 代表x或y。例如,‘z丨food’ 匹配"z"或"food"。‘(z丨f)ood’ 匹配"zood"或"food"
X 字符x(x代表任何合法的字符)
[xyz] 字符集。匹配包含的任一指定字符。例如,"[abc]“匹配"plain"中的"a”。
[^xyz] 代表反向字符集。匹配未包含在指定字符集的任何字符。例如,"[^abc]“可以匹配"plain"中"p”,“l(fā)”,“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 代表非字邊界?!癳r\B"匹配"verb"中的"er”,但不匹配"never"中的"er"。
\cx 匹配x指示的控制字符。例如,\cM 匹配 Control-M 或回車符。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è)回車符,等效于 \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,代表任何字類字符,包括下劃線。與"[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),m和l是八進(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類給我們提供了如下幾個(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)的操作類

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

● Pattern類: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類沒(méi)有公共的構(gòu)造方法。如果我們想要?jiǎng)?chuàng)建Pattern對(duì)象,可以調(diào)用其公共的靜態(tài)方法compile(),它會(huì)返回一個(gè)Pattern對(duì)象,且該方法要接受一個(gè)正則表達(dá)式作為它的第一個(gè)參數(shù)。

● Matcher類:Matcher類是對(duì)輸入的字符串進(jìn)行解釋和匹配操作的引擎,該類也沒(méi)有公共的構(gòu)造方法,我們可以通過(guò)Pattern對(duì)象的matcher()方法來(lái)獲得一個(gè)Matcher對(duì)象。

● PatternSyntaxException類:PatternSyntaxException是一個(gè)非強(qiáng)制的異常類,它可以表示在正則表達(dá)式中出現(xiàn)的語(yǔ)法異常。

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

//將一個(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)我們?cè)偻ㄟ^(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類進(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é)語(yǔ)

至此,我們就把正則表達(dá)式給大家簡(jiǎn)單地介紹完了,現(xiàn)在總結(jié)一下今天的重點(diǎn):

● 掌握正則表達(dá)式的基本語(yǔ)法規(guī)則;

● 掌握J(rèn)ava代碼中使用正則表達(dá)式;

● 了解幾個(gè)常用的正則表達(dá)式匹配規(guī)則,比如手機(jī)號(hào)、身份證號(hào)等的驗(yàn)證;文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-455169.html

到了這里,關(guān)于從零開(kāi)始學(xué)Java56--與字符串相關(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)文章

  • java之字符串與正則表達(dá)式

    java之字符串與正則表達(dá)式

    目錄 String 構(gòu)造方法 注意 格式控制字符串 常用方法 StringBuilder與StringBuffer 特點(diǎn) 理解可變與不可變 字符串拼接方法 字符串刪除方法 字符串內(nèi)插入字符 字符串替換方法 字符串反轉(zhuǎn)方法 查字符串對(duì)應(yīng)索引處的字符? 截取字符串 正則表達(dá)式 正則表達(dá)式符號(hào)表 正則表達(dá)式常用方

    2023年04月22日
    瀏覽(25)
  • JavaScript從入門到精通系列第三十一篇:詳解JavaScript中的字符串和正則表達(dá)式相關(guān)的方法

    JavaScript從入門到精通系列第三十一篇:詳解JavaScript中的字符串和正則表達(dá)式相關(guān)的方法

    ? 文章目錄 知識(shí)回顧 1:概念回顧 2:正則表達(dá)式字面量 一:字符串中正則表達(dá)式方法 1:split 2:search 3:match 4:replace ????????正則表達(dá)式用于定義一些字符串的規(guī)則,計(jì)算機(jī)可以根據(jù)正則表達(dá)式檢查一個(gè)字符串是否符合規(guī)則,或者將字符串中符合規(guī)則的內(nèi)容提取出來(lái)。

    2024年01月17日
    瀏覽(35)
  • java 判斷字符串中有漢字 (常用正則表達(dá)式)

    今天在開(kāi)發(fā)中碰到了判斷字符串中是否有漢字的問(wèn)題,方便起見(jiàn),記錄下來(lái)以便后期查看。 1、判斷漢字 2、判斷數(shù)字 3、常用的正則表達(dá)式( 通過(guò)?Java常用正則表達(dá)式_正則表達(dá)式0到9_歐尼熊不懂的博客-CSDN博客) (1)校驗(yàn)數(shù)字的正則表達(dá)式 (2)校驗(yàn)字符的正則表達(dá)式 (

    2024年02月11日
    瀏覽(21)
  • 華為OD機(jī)試 - 數(shù)字字符串組合倒序 - 正則表達(dá)式(Java 2023 B卷 100分)

    華為OD機(jī)試 - 數(shù)字字符串組合倒序 - 正則表達(dá)式(Java 2023 B卷 100分)

    華為OD機(jī)試 2023B卷題庫(kù)瘋狂收錄中,刷題

    2024年02月09日
    瀏覽(24)
  • 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日
    瀏覽(18)
  • 12.字符串和正則表達(dá)式

    正則表達(dá)式相關(guān)知識(shí) 在編寫(xiě)處理字符串的程序或網(wǎng)頁(yè)時(shí),經(jīng)常會(huì)有查找符合某些復(fù)雜規(guī)則的字符串的需要,正則表達(dá)式就是用于描述這些規(guī)則的工具,換句話說(shuō)正則表達(dá)式是一種工具,它定義了字符串的匹配模式(如何檢查一個(gè)字符串是否有跟某種模式匹配的部分或者從一個(gè)

    2024年01月16日
    瀏覽(29)
  • JavaScript丨使用正則截取字符串內(nèi)容

    參考來(lái)源: JS 正則截取字符串 - 義美-小義 - 博客園 js正則去除雙引號(hào)和斜杠_周達(dá)的博客-CSDN博客_js去掉斜杠 js將字符串中所有反斜杠替換成正斜杠/_Name is Q的博客-CSDN博客_js字符串替換斜杠

    2024年02月10日
    瀏覽(15)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包