iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0

regex

正規表示式(Regular expression)可以用簡單的字串作為句法規則而以此描述文章中所有符合該字串的指定格式的字串,這個字串被稱為模式(pattern)。
這概念最初由Unix的工具軟體(sed, grep, ...)普及,換句話說學習正規表示式可以讓你在使用Linux時事半功倍

基本結構

大部分的pattern型式都有以下結構

  1. |
  • 可當成或邏輯,只要字串中包含該符號分隔的group皆為符合
  • 若無包在括號則
  • 為最低優先級

E.g. Linux|macOS對於包含Linux或macOS的字串皆符合該pattern

  1. .
  • 匹配任意字元(\r, \n以外)
    E.g. Arc. Linux對於包含Arch Linux或Arco Linux的字串皆符合該pattern
  1. [xyz]
  • 匹配中括號中出現的字元集合
  • 集合中除了跳脫字元外皆視為普通字元
  • 若要使用範圍則在範圍初始字元與範圍結束字元中間加上橫線-
  • 在字元前面加上^則是反向匹配(只對所有不包含於中括號內的字元符合)
    E.g. [A-Za-z0-9]對於所有英數字字元皆符合
  1. *
  • pattern出現任意次數皆符合
  • 預設為貪婪模式(盡量多次搜尋)
  1. {min,max}
  • 指定前面的pattern出現次數(m到n次)
  • 只指定一個數字({n})時則代表出現剛好n次
  • min或max皆為非負整數且不一定必要
    • {min,}代表至少Min次
    • {,max}代表最多Max次
    • 甚至可以m,n都不給,這樣不管字串中有沒有包含這個pattern都為符合(等價於*)
  1. ?
  • 檢查pattern是否存在最多1次
  • 等價於{,1}
  • 用於數量詞({m,n}, *, ?)可以使用lazy mode以進行盡量少次搜尋
  1. (pattern)
  • 將括號內的pattern包成一個group,並取得符合pattern的子字串
  1. ^: 符合輸入字串的開始位置
  2. $: 符合輸入字串的結束位置

在相容POSIX的UNIX系統上,grep和egrep之類的工具都遵循POSIX規範,一些資料庫系統中的正規表示式也符合POSIX規範。grep、vi、sed都屬於BRE,是歷史最早的正規表示式,因此元字元(+, *,|與括號)必須轉譯之後才具有特殊含義。egrep、awk則屬於ERE,元字元不用轉譯

擴充語法

分為基本型正規表示式(Basic Regular Expression,BRE)和擴充型正規表示式(Extended Regular Expression,ERE)兩大流派,主要差別在於是否需要將pattern中的元字元進行跳轉處理

POSIX字元組

  • [:alnum:]: 字母與數字字元
    • [:alpha:](字母)與[:digit:](數字)組合而成
    • 等價於[a-zA-Z0-9]
  • [:ascii:]: 顧名思義指所有ascii字元
  • [:graph]: 範圍在\x21到\x7E的ascii字元
    • 這個為ascii中的可視字元
    • 若要包含空格,需改用[:print:]
  • [:xdigit:]: 16進制數字
  • [:space:]: 空白字元

優先順序

符號 優先權
\ 最高
()、(?:)、(?=)、[]
*、+、?、{n}、{n,}、{n,m}
^、$、中介字元
相鄰字元連接 次最低
| 最低

REF

小菜一碟 要注意 Regular Expression 的 Greedy Mode(貪婪模式)
regex101
wikipedia


上一篇
Day9: 遠端連線
下一篇
Day11:文字處理
系列文
I Use Linux BTW: 談Linux與其指令30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言