這篇博客是關(guān)于正則表達(dá)式(regex)的插圖指南,旨在為那些從來沒有使用過正則表達(dá)式,想嘗試但又望而生畏的新手提供一個(gè)簡(jiǎn)單介紹。
所以,歡迎使用正則表達(dá)式…
對(duì)于大多數(shù)沒有接受過正式 CS 教育的人來說,正則表達(dá)式似乎只有最核心的 Unix 程序員才敢碰。
一個(gè)好的正則表達(dá)式看起來像魔法,但請(qǐng)記住:任何足夠先進(jìn)的技術(shù)都無法與魔法區(qū)分開來。
所以,就讓我們揭開正則表達(dá)式的神秘面紗!
如果你理解正則表達(dá)式,它會(huì)突然變成一個(gè)超快速和強(qiáng)大的工具……但你首先需要理解它,老實(shí)說,我覺得新手可能會(huì)對(duì)它望而生畏!
讓我們從基礎(chǔ)開始。正則表達(dá)式(regex)是什么?它們的用途是什么?
Regex 新手上路
本質(zhì)上來看,正則表達(dá)式是定義一種搜索模式的字符序列。
正則表達(dá)式通常用于 grep 等工具中,以在較長(zhǎng)文本字符串中查找模式。
考慮以下一個(gè) cat.txt 文件:
catcat2dog
如果我們使用正則表達(dá)式 cat 來搜索匹配項(xiàng),我們會(huì)找到以下匹配項(xiàng):
catcat2
高級(jí)用戶需要注意的是,本文存在一個(gè)技術(shù)上的錯(cuò)誤,即正則表達(dá)式和使用正則表達(dá)式的工具(如 grep)混為了一談。
正則表達(dá)式適用于字符,而不是單詞
需要反復(fù)強(qiáng)調(diào)的一個(gè)重要問題是:正則表達(dá)式適用于字符,而不是單詞。隱含串聯(lián)。
如果我們使用正則表達(dá)式搜索模式 cat,則不會(huì)查找單詞「cat」,而會(huì)查找字符 c、a 和 t。
點(diǎn)和星號(hào)
最基本的字符是單個(gè)字符,如 a、b、c 等。現(xiàn)在讓我們介紹以下兩種特殊的字符。
.(點(diǎn))字符可以匹配*任何單個(gè)字符*。例如,如果我們搜索 c.t,則將匹配從 cat 到 c0t 或 cAt 的任何內(nèi)容,并將匹配任何單個(gè)字符 c +任何字符+單個(gè)字符 t。
*(星號(hào))字符有點(diǎn)困難。它修改它前面的字符,然后匹配該字符的*零個(gè)或多個(gè)字符*。的確如此。例如,cat*可以匹配 cat、catt、cattttt 以及 ca。
示例分析:The cat ate my homework
假設(shè)我們逐行讀取一個(gè)文件,則第一行如下所示:
The cat ate my homework.
讓我們看看如何匹配該行中的模式 cat。
我們首先將該模式的首字符與句子中的首字符匹配。
如果找不到匹配項(xiàng),則跳轉(zhuǎn)至該行中的下一個(gè)字符,然后再從模式的首字符開始。
如果我們找到一個(gè)匹配項(xiàng),則將跳轉(zhuǎn)至模式和該行中的下一個(gè)字符,然后重復(fù)這個(gè)過程。當(dāng)我們找到整個(gè)模式的匹配時(shí),返回找到匹配項(xiàng)的行。
這就是正則表達(dá)式最基本、最常用的功能,即在較大的字符串中查找較小的搜索模式。
講到這里,我想大家已經(jīng)大致了解了什么是正則表達(dá)式以及它的兩個(gè)特殊字符: .(點(diǎn))和 *(星號(hào))。接下來,我會(huì)為大家介紹更多其他內(nèi)容。
正則表達(dá)式三叉戟
正則表達(dá)式的各個(gè)部分可以由三個(gè)不同的組件組成:
錨點(diǎn)
字符集
修飾符
這三部分構(gòu)成了正則表達(dá)式的三叉戟!
讓我們從三叉戟的第一個(gè)部分開始:錨點(diǎn)!
錨點(diǎn)
錨點(diǎn)指定個(gè)各行的模式位置。下面是兩個(gè)最重要的錨點(diǎn):
^(插入符號(hào))將模式固定到行首。例如,模式^1 匹配以 1 開頭的任意行。
$(美元符)將模式固定到句尾。例如,9$匹配以 9 結(jié)尾的任意行。
注意,在以上兩種情況下,錨點(diǎn)必須分別位于模式的開頭和結(jié)尾。^1 匹配行首的 1,但 1^匹配后跟^的 1。類似地,1$匹配以 1 結(jié)尾的行,但$1 匹配一個(gè)該行任意位置后跟 1 的美元符號(hào)。
字符集
三叉戟的第二部分:字符集。字符集是正則表達(dá)式的基礎(chǔ)。單個(gè)字符,比如 a,是最基本的字符集(一組元素)。但是 [0-9] 等正則表達(dá)式可以匹配任何一個(gè)數(shù)字,或者如果你能回想到 *的含義,則可以制作模式 [0-9][0-9](這個(gè)模式匹配的內(nèi)容留給讀者作為練習(xí))。
其他一些重要的字符集:
[0-9] 匹配 0…9 中的任何一個(gè)數(shù)字
[a-z] 匹配任何小寫字母
[A-Z] 匹配任何大寫字母
我們還可以對(duì)多個(gè)字符集進(jìn)行組合:
[A-ZA-Z0-9] 匹配任何大小寫字母和單個(gè)數(shù)字。
修飾符
此部分內(nèi)容沒有深入展開,以前面遇到的一個(gè)修飾符 *(星號(hào))為例。修飾符改變它前面字符的含義。還有很多其他的修飾符,但以* 為例進(jìn)行討論是一個(gè)很好的開始。
如下所示:讓我們快速將文本轉(zhuǎn)儲(chǔ)到文件中。
$ echo "The cat jumps long time Then we also have the fact that these are words. 1234 this is a test post please ignore." >> grep.txt
這是現(xiàn)在文件中的內(nèi)容。
$ cat grep.txtThe cat jumps long timeThen we also have the fact that these are words.1234thisisatestpostpleaseignore.
尋找 cat。
$ grep "cat" grep.txtThe cat jumps long time
尋找任何以數(shù)字^[0-9] 開始的任意行。
$ grep "^[0-9]" grep.txt1234 this is a test post please ignore.
就是這樣!你剛剛使用了正則表達(dá)式。太棒了。
總結(jié)
回顧一下這篇博客的內(nèi)容:
正則表達(dá)式的基本功能;
正則表達(dá)式的三個(gè)主要組件:錨點(diǎn)、字符集和修飾符。
.(點(diǎn))、*(星號(hào))、^(插入符)和$(美元符號(hào))。
一些字符集 [0-9]、[a-z]、[A-Z] 和它們的組合。
這篇博客的目的是通過帶插圖的介紹使用戶更輕松地了解正則表達(dá)式。
如果能夠克服技術(shù)上的困難,則最終可以掌握這種相對(duì)簡(jiǎn)單但功能卻很強(qiáng)大的正則表達(dá)式工具,從而為任何數(shù)據(jù)科學(xué)家?guī)韺氋F的價(jià)值。
-
字符
+關(guān)注
關(guān)注
0文章
234瀏覽量
25426 -
正則表達(dá)式
+關(guān)注
關(guān)注
0文章
28瀏覽量
3634
原文標(biāo)題:新手上路:圖文解讀助你理解和使用正則表達(dá)式
文章出處:【微信號(hào):almosthuman2014,微信公眾號(hào):機(jī)器之心】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Cubeide1.18.1在線調(diào)試改變\"現(xiàn)場(chǎng)表達(dá)式\"中的值提示找不到地址怎么解決?
Linux中文本處理命令的用法

Linux grep命令詳解
詳解nginx中的正則表達(dá)式

Verilog表達(dá)式的位寬確定規(guī)則

通過工業(yè)智能網(wǎng)關(guān)實(shí)現(xiàn)中間變量表達(dá)式的快速配置

nginx中的正則表達(dá)式和location路徑匹配指南

求助,以下恒流源電路Io的計(jì)算表達(dá)式怎么計(jì)算?
TestStand表達(dá)式中常用的語法規(guī)則和運(yùn)算符使用

Java表達(dá)式引擎選型調(diào)研分析

評(píng)論