新聞中心
先嘗試執(zhí)行下面的代碼:

創(chuàng)新互聯(lián)是專(zhuān)業(yè)的薩迦網(wǎng)站建設(shè)公司,薩迦接單;提供做網(wǎng)站、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專(zhuān)業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行薩迦網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專(zhuān)業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專(zhuān)業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
- println("play \n scala".matches(".*"))
你沒(méi)看錯(cuò),打印結(jié)果是false。正如鍵盤(pán)布局一樣,這是由于一個(gè)歷史問(wèn)題導(dǎo)致的。早期的正則表達(dá)式工具是基于行處理文本的,所以.匹配的是除換行符以外的任意字符。大多數(shù)編程語(yǔ)言在設(shè)計(jì)正則表達(dá)式時(shí)沿用了這個(gè)傳統(tǒng),但是提供一個(gè)選項(xiàng)用于開(kāi)啟"點(diǎn)號(hào)匹配換行符"模式。
Java提供了兩種方式開(kāi)啟"點(diǎn)號(hào)匹配換行符"模式,***種方式是在構(gòu)建Pattern對(duì)象時(shí)指定匹配模式:
- val p = Pattern.compile(".*", Pattern.DOTALL)
- println(p.matcher("play\nscala").matches()) // true
另一種方式是在正則表達(dá)式開(kāi)始位置指定嵌入模式修飾符(embedded mode modifier),這也是一種比較通用的方式:
- println("play\nscala".matches("(?s).*")) // true
Pattern.DOTALL和(?s)是等價(jià)的。
Java常用的匹配模式有以下幾種:
1) Pattern.DOTALL
啟用dotall模式。在dotall模式下,模式中的.匹配任意字符,包括換行符。在默認(rèn)情況下(即未啟用dotall模式),.不匹配換行符。等價(jià)于修飾符(?s)。
- val p = Pattern.compile(".*", Pattern.DOTALL)
- val m = p.matcher("play\nscala")
- println(m.matches())
- // 輸出
- true
2)Pattern.MULTILINE
啟用多行匹配模式。在多行匹配模式下,模式中的^和$將逐次匹配每一行的行首和行尾。在默認(rèn)情況下(即未啟用多行匹配模式),^和$將匹配整個(gè)字符串的首部和尾部。等價(jià)于修飾符(?m)。
- val p = Pattern.compile("^.*$", Pattern.MULTILINE)
- val m = p.matcher("play\nscala")
- while (m.find()) {
- println("find: " + m.group(0))
- }
- // 輸出
- find: play
- find: scala
3) Pattern.UNIX_LINES
啟用Unix換行模式,使用"\n"標(biāo)識(shí)每一行的末尾,等價(jià)于修飾符(?d)。
- val p = Pattern.compile("^.*$", Pattern.UNIX_LINES | Pattern.MULTILINE)
- val m = p.matcher("play\r\nscala")
- while (m.find()) {
- println("find: " + m.group(0).length)
- }
- // 輸出
- find: 5
- find: 5
輸出的兩個(gè)結(jié)果長(zhǎng)度都為5,原因是play末尾還有一個(gè)字符\r。
4)Pattern.CASE_INSENSITIVE
啟用大小寫(xiě)不敏感匹配,等價(jià)于修飾符(?i)。
- val p = Pattern.compile("^S.*A$", Pattern.CASE_INSENSITIVE)
- val m = p.matcher("scala")
- println(m.matches())
- // 輸出
- true
5)Pattern.LITERAL
啟用字面(literal)模式解析,模式中的元字符和轉(zhuǎn)義字符將按照普通字符解析。
- val p = Pattern.compile(".*", Pattern.LITERAL)
- val m = p.matcher("scala")
- println(m.matches())
- // 輸出
- false
6)Pattern.COMMENTS
正則表達(dá)式中允許出現(xiàn)空白符(whitespace)和注解(comments),空白符會(huì)被忽略,以#開(kāi)頭的注解行也將被忽略,等價(jià)于修飾符(?x);
- val p = Pattern.compile(" .* ", Pattern.COMMENTS)
- val m = p.matcher("scala")
- println(m.matches())
- // 輸出
- true
注:有些編程語(yǔ)言(例如JavaScript)不支持嵌入模式修飾符(embedded mode modifier),這時(shí)可以使用另一種解決方案:
- [\s\S]*
[\s]會(huì)匹配任意空白字符,[\S]而則會(huì)匹配[\s]不能匹配的任意字符。把這二者組合起來(lái)構(gòu)成[\s\S],這樣就會(huì)得到一個(gè)包含所有字符的字符組,其中也包含了換行符。
文章題目:令人抓狂的代碼-萬(wàn)能正則表達(dá)式.*陷阱
當(dāng)前網(wǎng)址:http://m.fisionsoft.com.cn/article/dhcghpo.html


咨詢(xún)
建站咨詢(xún)
