日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

1.20 正则表达式详解

發(fā)布時(shí)間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1.20 正则表达式详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正則表達(dá)式(Regular Expression)又稱(chēng)正規(guī)表示法、常規(guī)表示法,在代碼中常簡(jiǎn)寫(xiě)為 regex、regexp 或 RE,它是計(jì)算機(jī)科學(xué)的一個(gè)概念。

正則表達(dá)式是一個(gè)強(qiáng)大的字符串處理工具,可以對(duì)字符串進(jìn)行查找、提取、分割、替換等操作,是一種可以用于模式匹配和替換的規(guī)范。一個(gè)正則表達(dá)式就是由普通的字符(如字符 a~z)以及特殊字符(元字符)組成的文字模式,它用以描述在查找文字主體時(shí)待匹配的一個(gè)或多個(gè)字符串。

String 類(lèi)里也提供了如下幾個(gè)特殊的方法。

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

上面這些特殊的方法都依賴于 Java 提供的正則表達(dá)式支持,除此之外,Java 還提供了 Pattern 和 Matcher 兩個(gè)類(lèi)專(zhuān)門(mén)用于提供正則表達(dá)式支持。

很多讀者都會(huì)覺(jué)得正則表達(dá)式是一個(gè)非常神奇、高級(jí)的知識(shí),其實(shí)正則表達(dá)式是一種非常簡(jiǎn)單而且非常實(shí)用的工具。正則表達(dá)式是一個(gè)用于匹配字符串的模板。實(shí)際上,任意字符串都可以當(dāng)成正則表達(dá)式使用。例如“abc”,它也是一個(gè)正則表達(dá)式,只是它只能匹配“abc”字符串。

如果正則表達(dá)式僅能匹配“abc”這樣的字符串,那么正則表達(dá)式也就不值得學(xué)習(xí)了。正則表達(dá)式作為一個(gè)用于匹配字符串的模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。本文簡(jiǎn)單了解一下如何使用正則表達(dá)式來(lái)操作字符串。

正則表達(dá)式支持字符

創(chuàng)建正則表達(dá)式就是創(chuàng)建一個(gè)特殊的字符串。正則表達(dá)式所支持的合法字符如表 1 所示。

表 1 正則表達(dá)式所支持的合法字符

字符解釋
X字符x(x 可代表任何合法的字符)
\0mnn八進(jìn)制數(shù) 0mnn 所表示的字符
\xhh十六進(jìn)制值 0xhh 所表示的字符
\uhhhh十六進(jìn)制值 0xhhhh 所表示的 Unicode 字符
\t制表符(“\u0009”)
\n 新行(換行)符(‘\u000A’)
\r 回車(chē)符(‘\u000D’)
\f換頁(yè)符(‘\u000C’)
\a報(bào)警(bell)符(‘\u0007’)
\eEscape 符(‘\u001B’)
\cxx 對(duì)應(yīng)的的控制符。例如,\cM匹配 Ctrl-M。x 值必須為 A~Z 或 a~z 之一。

除此之外,正則表達(dá)式中有一些特殊字符,這些特殊字符在正則表達(dá)式中有其特殊的用途,比如前面介紹的反斜線\。

如果需要匹配這些特殊字符,就必須首先將這些字符轉(zhuǎn)義,也就是在前面添加一個(gè)反斜線\。正則表達(dá)式中的特殊字符如表 2 所示。

表 2 正則表達(dá)式中的特殊字符

特殊字符說(shuō)明
$匹配一行的結(jié)尾。要匹配 $ 字符本身,請(qǐng)使用$
^匹配一行的開(kāi)頭。要匹配 ^ 字符本身,請(qǐng)使用^
()標(biāo)記子表達(dá)式的開(kāi)始和結(jié)束位置。要匹配這些字符,請(qǐng)使用(和)
[]用于確定中括號(hào)表達(dá)式的開(kāi)始和結(jié)束位置。要匹配這些字符,請(qǐng)使用[和]
{}用于標(biāo)記前面子表達(dá)式的出現(xiàn)頻度。要匹配這些字符,請(qǐng)使用{和}
*指定前面子表達(dá)式可以出現(xiàn)零次或多次。要匹配 * 字符本身,請(qǐng)使用*
+指定前面子表達(dá)式可以出現(xiàn)一次或多次。要匹配 + 字符本身,請(qǐng)使用+
指定前面子表達(dá)式可以出現(xiàn)零次或一次。要匹配 ?字符本身,請(qǐng)使用?
.匹配除換行符\n之外的任何單字符。要匹配.字符本身,請(qǐng)使用.
\用于轉(zhuǎn)義下一個(gè)字符,或指定八進(jìn)制、十六進(jìn)制字符。如果需匹配\字符,請(qǐng)用\
|指定兩項(xiàng)之間任選一項(xiàng)。如果要匹配丨字符本身,請(qǐng)使用|

將上面多個(gè)字符拼起來(lái),就可以創(chuàng)建一個(gè)正則表達(dá)式。例如:

"\u0041\\\\" // 匹配 A\ "\u0061\t" // 匹配a<制表符> "\\?\\[" // 匹配?[

注意:可能大家會(huì)覺(jué)得第一個(gè)正則表達(dá)式中怎么有那么多反斜杠?這是由于 Java 字符串中反斜杠本身需要轉(zhuǎn)義,因此兩個(gè)反斜杠(\)實(shí)際上相當(dāng)于一個(gè)(前一個(gè)用于轉(zhuǎn)義)。

上面的正則表達(dá)式依然只能匹配單個(gè)字符,這是因?yàn)檫€未在正則表達(dá)式中使用“通配符”,“通配符”是可以匹配多個(gè)字符的特殊字符。正則表達(dá)式中的“通配符”遠(yuǎn)遠(yuǎn)超出了普通通配符的功能,它被稱(chēng)為預(yù)定義字符,正則表達(dá)式支持如表 3 所示的預(yù)定義字符。

表 3 預(yù)定義字符

預(yù)定義字符說(shuō)明
.可以匹配任何字符
\d匹配 0~9 的所有數(shù)字
\D匹配非數(shù)字
\s匹配所有的空白字符,包括空格、制表符、回車(chē)符、換頁(yè)符、換行符等
\S匹配所有的非空白字符
\w匹配所有的單詞字符,包括 0~9 所有數(shù)字、26 個(gè)英文字母和下畫(huà)線_
\W匹配所有的非單詞字符

上面的 7 個(gè)預(yù)定義字符其實(shí)很容易記憶,其中:

  • d 是 digit 的意思,代表數(shù)字。
  • s 是 space 的意思,代表空白。
  • w 是 word 的意思,代表單詞。
  • d、s、w 的大寫(xiě)形式恰好匹配與之相反的字符。

有了上面的預(yù)定義字符后,接下來(lái)就可以創(chuàng)建更強(qiáng)大的正則表達(dá)式了。例如:

c\wt // 可以匹配cat、cbt、cct、cOt、c9t等一批字符串
\d\d\d-\d\d\d-\d\d\d\d // 匹配如 000-000-0000 形式的電話號(hào)碼

在一些特殊情況下,例如,若只想匹配 a~f 的字母,或者匹配除 ab 之外的所有小寫(xiě)字母,或者匹配中文字符,上面這些預(yù)定義字符就無(wú)能為力了,此時(shí)就需要使用方括號(hào)表達(dá)式,方括號(hào)表達(dá)式有如表 4 所示的幾種形式。

表 4 方括號(hào)表達(dá)式

方括號(hào)表達(dá)式比前面的預(yù)定義字符靈活多了,幾乎可以匹配任何字符。例如,若需要匹配所有的中文字符,就可以利用 [\u0041-\u0056] 形式——因?yàn)樗兄形淖址?Unicode 值是連續(xù)的,只要找出所有中文字符中最小、最大的 Unicode 值,就可以利用上面形式來(lái)匹配所有的中文字符。

正則表達(dá)式還支持圓括號(hào),用于將多個(gè)表達(dá)式組成一個(gè)子表達(dá)式,圓括號(hào)中可以使用或運(yùn)算符|。例如,正則表達(dá)式“((public)|(protected)|(private))”用于匹配 Java 的三個(gè)訪問(wèn)控制符其中之一。

除此之外,Java 正則表達(dá)式還支持如表 5 所示的幾個(gè)邊界匹配符。

表 5 邊界匹配符

邊界匹配符說(shuō)明
^行的開(kāi)頭
$行的結(jié)尾
\b單詞的邊界
\B非單詞的邊界
\A輸入的開(kāi)頭
\G前一個(gè)匹配的結(jié)尾
\Z輸入的結(jié)尾,僅用于最后的結(jié)束符
\z輸入的結(jié)尾

前面例子中需要建立一個(gè)匹配 000-000-0000 形式的電話號(hào)碼時(shí),使用了 \d\d\d-\d\d\d-\d\d\d\d 正則表達(dá)式,這看起來(lái)比較煩瑣。實(shí)際上,正則表達(dá)式還提供了數(shù)量標(biāo)識(shí)符,正則表達(dá)式支持的數(shù)量標(biāo)識(shí)符有如下幾種模式。

  • Greedy(貪婪模式):數(shù)量表示符默認(rèn)采用貪婪模式,除非另有表示。貪婪模式的表達(dá)式會(huì)一直匹配下去,直到無(wú)法匹配為止。如果你發(fā)現(xiàn)表達(dá)式匹配的結(jié)果與預(yù)期的不符,很有可能是因?yàn)槟阋詾楸磉_(dá)式只會(huì)匹配前面幾個(gè)字符,而實(shí)際上它是貪婪模式,所以會(huì)一直匹配下去。
  • Reluctant(勉強(qiáng)模式):用問(wèn)號(hào)后綴(?)表示,它只會(huì)匹配最少的字符。也稱(chēng)為最小匹配模式。
  • Possessive(占有模式):用加號(hào)后綴(+)表示,目前只有 Java 支持占有模式,通常比較少用。

三種模式的數(shù)量表示符如表 6 所示。

表 6 三種模式的數(shù)量表示符


關(guān)于貪婪模式和勉強(qiáng)模式的對(duì)比,看如下代碼:

String str = "hello,java!"; // 貪婪模式的正則表達(dá)式 System.out.println(str.replaceFirst("\\w*" , "■")); //輸出■,java! // 勉強(qiáng)模式的正則表達(dá)式 System.out.println(str.replaceFirst("\\w*?" , "■"")); //輸出■hello, java!

當(dāng)從“hello java!”字符串中查找匹配\\w*子串時(shí),因?yàn)閈w*使用了貪婪模式,數(shù)量表示符*會(huì)一直匹配下去,所以該字符串前面的所有單詞字符都被它匹配到,直到遇到空格,所以替換后的效果是“■,Java!”;如果使用勉強(qiáng)模式,數(shù)量表示符*會(huì)盡量匹配最少字符,即匹配 0 個(gè)字符,所以替換后的結(jié)果是“■hello,java!”。

總結(jié)

以上是生活随笔為你收集整理的1.20 正则表达式详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。