成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

令人抓狂的代碼 - 萬能正則表達式.*陷阱

開發 后端
早期的正則表達式工具是基于行處理文本的,所以.匹配的是除換行符以外的任意字符。大多數編程語言在設計正則表達式時沿用了這個傳統,但是提供一個選項用于開啟"點號匹配換行符"模式。

[[207401]]

先嘗試執行下面的代碼:

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

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

Java提供了兩種方式開啟"點號匹配換行符"模式,***種方式是在構建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 

 

輸出的兩個結果長度都為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)模式解析,模式中的元字符和轉義字符將按照普通字符解析。

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

 

6)Pattern.COMMENTS

正則表達式中允許出現空白符(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]不能匹配的任意字符。把這二者組合起來構成[\s\S],這樣就會得到一個包含所有字符的字符組,其中也包含了換行符。 

 

責任編輯:龐桂玉 來源: joymufeng的博客
相關推薦

2019-02-20 12:54:34

DumpCPU java

2018-09-27 15:25:08

正則表達式前端

2020-09-04 09:16:04

Python正則表達式虛擬機

2024-09-14 09:18:14

Python正則表達式

2016-11-10 16:21:22

Java 正則表達式

2009-09-16 17:15:57

正則表達式引擎

2022-01-04 11:35:03

Linux Shel正則表達式Linux

2023-09-13 08:12:45

2009-08-07 14:24:31

.NET正則表達式

2022-03-28 06:19:14

正則表達式開發

2021-01-27 11:34:19

Python正則表達式字符串

2009-02-18 09:48:20

正則表達式Java教程

2019-07-17 15:45:47

正則表達式字符串前端

2009-09-16 18:19:34

正則表達式組

2011-06-02 12:34:16

正則表達式

2017-05-12 10:47:45

Linux正則表達式程序基礎

2010-03-25 18:25:36

Python正則表達式

2010-03-12 17:44:21

Python正則表達式

2012-04-28 15:22:46

PHP

2009-09-08 09:32:13

正則表達式學習
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产毛片视频 | 国产精品视频在线观看 | 日日碰狠狠躁久久躁婷婷 | 色偷偷人人澡人人爽人人模 | 成人欧美日韩一区二区三区 | 国产中文一区二区三区 | 中文字幕一区二区不卡 | japanhdxxxx裸体 | 蜜臀网 | 日韩美av| 中文字幕亚洲视频 | 日批免费看 | 夜夜精品浪潮av一区二区三区 | 亚洲一区二区三区高清 | 中文字幕日韩在线 | 91精品综合久久久久久五月天 | 99中文字幕 | 国产精品久久免费观看 | 日韩欧美操 | 亚洲国产黄 | 欧美精品一区二区在线观看 | 久久精品99国产精品 | 日韩中文字幕在线观看视频 | 国产高清免费视频 | 99热在线免费 | 精品96久久久久久中文字幕无 | 伊人色综合久久久天天蜜桃 | 亚洲精品一二三 | 成人福利电影 | 欧美xxxx做受欧美 | 91夜色在线观看 | 欧美在线观看一区二区 | av黄色在线 | 日韩精品一区二区不卡 | 成人不卡一区二区 | 久久这里只有精品首页 | 欧美久久久电影 | 日韩在线视频播放 | 中文字幕精品一区 | 2020国产在线 | 亚洲一区中文字幕 |