日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
令人抓狂的代碼-萬能正則表達式.*陷阱

先嘗試執(zhí)行下面的代碼:

創(chuàng)新互聯(lián)是專業(yè)的薩迦網(wǎng)站建設(shè)公司,薩迦接單;提供做網(wǎng)站、網(wǎng)站設(shè)計,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行薩迦網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!

 
 
 
  1. println("play \n scala".matches(".*")) 

你沒看錯,打印結(jié)果是false。正如鍵盤布局一樣,這是由于一個歷史問題導致的。早期的正則表達式工具是基于行處理文本的,所以.匹配的是除換行符以外的任意字符。大多數(shù)編程語言在設(shè)計正則表達式時沿用了這個傳統(tǒng),但是提供一個選項用于開啟"點號匹配換行符"模式。

Java提供了兩種方式開啟"點號匹配換行符"模式,***種方式是在構(gòu)建Pattern對象時指定匹配模式:

 
 
 
  1. val p = Pattern.compile(".*", Pattern.DOTALL) 
  2.  
  3. println(p.matcher("play\nscala").matches()) // true 

另一種方式是在正則表達式開始位置指定嵌入模式修飾符(embedded mode modifier),這也是一種比較通用的方式:

 
 
 
  1. println("play\nscala".matches("(?s).*")) // true 

Pattern.DOTALL和(?s)是等價的。

Java常用的匹配模式有以下幾種:

1) Pattern.DOTALL

啟用dotall模式。在dotall模式下,模式中的.匹配任意字符,包括換行符。在默認情況下(即未啟用dotall模式),.不匹配換行符。等價于修飾符(?s)。

 
 
 
  1. val p = Pattern.compile(".*", Pattern.DOTALL) 
  2. val m = p.matcher("play\nscala") 
  3. println(m.matches()) 
  4. // 輸出 
  5. true 

2)Pattern.MULTILINE

啟用多行匹配模式。在多行匹配模式下,模式中的^和$將逐次匹配每一行的行首和行尾。在默認情況下(即未啟用多行匹配模式),^和$將匹配整個字符串的首部和尾部。等價于修飾符(?m)。

 
 
 
  1. val p = Pattern.compile("^.*$", Pattern.MULTILINE) 
  2. val m = p.matcher("play\nscala") 
  3. while (m.find()) { 
  4.   println("find: " + m.group(0)) 
  5.  
  6. // 輸出 
  7. find: play 
  8. find: scala 

3) Pattern.UNIX_LINES

啟用Unix換行模式,使用"\n"標識每一行的末尾,等價于修飾符(?d)。

 
 
 
  1. val p = Pattern.compile("^.*$", Pattern.UNIX_LINES | Pattern.MULTILINE) 
  2. val m = p.matcher("play\r\nscala") 
  3. while (m.find()) { 
  4.   println("find: " + m.group(0).length) 
  5. // 輸出 
  6. find: 5 
  7. find: 5 

輸出的兩個結(jié)果長度都為5,原因是play末尾還有一個字符\r。

4)Pattern.CASE_INSENSITIVE

啟用大小寫不敏感匹配,等價于修飾符(?i)。

 
 
 
  1. val p = Pattern.compile("^S.*A$", Pattern.CASE_INSENSITIVE) 
  2. val m = p.matcher("scala") 
  3. println(m.matches()) 
  4. // 輸出 
  5. true 

5)Pattern.LITERAL

啟用字面(literal)模式解析,模式中的元字符和轉(zhuǎn)義字符將按照普通字符解析。

 
 
 
  1. val p = Pattern.compile(".*", Pattern.LITERAL) 
  2. val m = p.matcher("scala") 
  3. println(m.matches()) 
  4. // 輸出 
  5. false 

6)Pattern.COMMENTS

正則表達式中允許出現(xiàn)空白符(whitespace)和注解(comments),空白符會被忽略,以#開頭的注解行也將被忽略,等價于修飾符(?x);

 
 
 
  1. val p = Pattern.compile(" .* ", Pattern.COMMENTS) 
  2. val m = p.matcher("scala") 
  3. println(m.matches()) 
  4. // 輸出 
  5. true 

注:有些編程語言(例如JavaScript)不支持嵌入模式修飾符(embedded mode modifier),這時可以使用另一種解決方案:

 
 
 
  1. [\s\S]* 

[\s]會匹配任意空白字符,[\S]而則會匹配[\s]不能匹配的任意字符。把這二者組合起來構(gòu)成[\s\S],這樣就會得到一個包含所有字符的字符組,其中也包含了換行符。 


網(wǎng)頁題目:令人抓狂的代碼-萬能正則表達式.*陷阱
本文路徑:http://www.5511xx.com/article/dhcghpo.html