1. 程式人生 > 實用技巧 >【簡單dp】ARC059C キャンディーとN人の子供 / Children and Candies

【簡單dp】ARC059C キャンディーとN人の子供 / Children and Candies

前言

正則表示式是一個字串處理的標準依據。是使用單個字串搜尋、匹配一系列符合某個語法規則的字串。通過特殊字元+普通字元來進行模式描述,從而達到文字匹配目的。

一、正則表示式分類

  • 字元類
  • 數量限定符
  • 位置限定符

1.1 字元類

元字元功能舉例
. 匹配除了換行符之外的任意一個字元 #egrep a.b 檔名;表示匹配檔案中a跟b之間有一個任意字元的行;
- 在括號中使用,表示匹配的字元的範圍 [0-9]表示的就是從數字0到數字9這個範圍的數字;
[ ] 匹配括號中的任意一個字元 #egrep [0-9] 檔名;表示匹配檔案中含有0-9任意一個數字的行;
[[:xxx:]] grep工具預定義的一些命名字元 [[:digit:]]表示匹配一個數字[0-9],[[:alpha:]表示匹配一個英文字母[a-Z]

1.2 數量限定符

字元功能舉例
? 緊跟在它前面的單元應匹配零次或者一次 ,是萬用字元的一種,等價於(0,1)
+ 緊跟在它前面的單元應匹配一次或者多次(至少一次),等價於(1,)
* 緊跟在它前面的單元匹配零次或者多次,是萬用字元的一種 “a”:表示匹配所有內容,包括空行;“aa”:表示匹配至少含有一個a的行;“aaa”:表示匹配至少含有兩個a的行;
{n} 緊跟在它前面的單元應匹配n次 [0-9]{4}:表示匹配4位數字;
{n,} 緊跟在它前面的單元應匹配至少n次 [0-9]{3,}:表示匹配至少匹配3位數字;
{,m} 緊跟在它前面的單元應匹配最多m次 [0-9]{,2}:表示匹配數字最多2位
{n,m} 緊跟在它前面的單元應匹配至少n次,最多m次 [0-9]{1,3}:表示匹配數字至少1位,最多3位;

1.3 位置限定符

元字元功能舉例
^ 匹配行首的位置;a.位於[ ]括號內,則匹配除括號中字元之外的任意字元,也就是對[ ]括號內的字元取反;b.位於[ ]括號外面,則表示以[ ]中的任意一個字元開頭 ^a:表示匹配檔案中以a開頭的行;[ ^0-9]:表示匹配任意一位非數字字元;
$ 匹配行尾的位置 “a$”:表示匹配以a結尾的行;

1.4 其他元字元

元字元功能舉例
\ 轉義符,可以將普通字元轉為特殊字元,將特殊字元轉為普通字元,大多時候是用在將特殊字元的含義取消 ".$“如果前面沒有加轉義符,則表示匹配以任意一個字元結尾的行,加上轉義字元之後表示匹配以”."結尾的行,也就是把“.“的特殊含義取消了,變成普通的”.”符號;
() 小括號可以將正則表示式的一部分括起來組成一個單元(也就是一個組),可以對整個單元使用數量限定符 ([a-z]-[0-9]){1,3}:表示匹配”字母-數字“這樣的格式的組合三次
| 連線兩個子表示式,表示或的關係 a|b表示a或者b;

1.5 表示集合的字元類描述

字元描述
[:alnum:] 表示所有字母數字的集合,[a-z A-Z 0-9]
[:alpha:] 表示所有字母的集合,[a-z A-Z]
[:digit:] 表示所有數字,[0-9]
[:lower:] 表示所有的小寫字母的集合,小寫[a-z]
[:upper:] 表示所有大寫字母的集合,大寫[A-Z]
[:space:] 表示空格
[:blank:] 表示所有空格或者製表鍵(tab鍵)的集合
[:punct:] 表示所有的標點字元
[:cntrl:] 表示所有的控制字元
[:print:] 表示所有的非控制字元
[:graph:] 表示所有可視,可列印的字元(不包含空格)
[:xdigit:] 表示所有十六進位制的數字的集合,[0-9 a-f A-F]

二、正則表示式優先順序

正則表示式與算術表示式類似,遵循優先順序順序,相同優先順序的從左到右進行運算,不同優先順序的運算先高後低。下表從上到下說明了各種正則表示式運算子的優先順序順序,同行表示同級:

運算子描述
\ 轉義符
(),(?:),(?=),[] 圓括號和方括號
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字元、任何字元 定位點和序列(即:位置和順序)
| “或"操作,字元具有高於替換運算子的優先順序,所以”s|get“匹配"s"或"get”。若要匹配"set"或"get",需要使用括號建立子表示式,例:"(s|g)et"