1. 程式人生 > >如果你跟我一樣是菜鳥,那應該看看這篇正則表示式指南

如果你跟我一樣是菜鳥,那應該看看這篇正則表示式指南

這是一篇正則表示式的圖解指南,這個指南適合那些從未擺弄過,剛開始想要學習正則表示式,卻被嚇了個半死的人(像我一樣)。對沒有受過正規計算機教育的人來說,正則表示式好像是隻有最核心的 Unix 程式設計師才敢接觸。

但其實不然。一個好的正則表示式看似神奇,但要記住這一點:任何足夠先進的技術都跟魔法無異。所以我們不要被它給嚇到,這篇文章讓我們從最基礎的知識開始,瞭解什麼是正則表示式以及它們用於什麼?

開始!

正則表示式的核心是定義搜尋模式的字元序列。通常用在像grep這樣的工具中,可以在更長的文字字串中查詢我們想要的內容。

假設有這麼一個檔案 cat.txt ,內容很簡單,只有三行:

cat
cat2
dog

如果我們使用 cat 這樣的表示式來進行檢索,那麼我們可以獲得結果

cat
cat2

(對於硬核使用者來說,在這篇文章中,我把正則表示式和使用正則表示式的工具(如grep)混淆。我知道這在技術上是錯誤的,只是為了表達方便)

正則表示式適用於字元,而不是單詞

在這裡需要強調的是:正則表示式適用於字元,而不是單詞。串聯是隱含的。

如果我們使用正則表示式搜尋模式cat,我們不是在尋找“cat”這個詞,而是我們正在尋找字元 c 而後跟一個a,而後又跟 t 字元。

點和星號

最基本的字元是單個字元,如a,b,c等。現在讓我們介紹兩個特殊的客人。

點號(.) 字元匹配任何單個字元。例如,如果我們搜尋c.t,我們將匹配從cat到c0t或cAt的任何內容,我們將匹配任何單個c,後跟任何字元,後跟單個t 字元。

*(星號)字元有點難度。它修改前面的字元,然後匹配零個或多個字元。是的,再讀一遍,零個或多個字元。例如,cat *會匹配cat,catt,cattttt但也會匹配。

貓吃了我的作業

想象一下,我們逐行讀取檔案,第一行如下:

The cat ate my homework.

讓我們來看看我們如何匹配這一行中的 cat 這個模式。

我們首先將模式的第一個字元與句子中的第一個字元進行匹配。

如果我們找不到匹配項,我們會跳到該行中的下一個字元,並從該模式的第一個字元開始。

如果我們找到匹配項,我們將轉到模式和行中的下一個字元並重復此過程。當我們找到整個模式的匹配時,我們返回找到匹配的行。

這就是正則表示式最常用於最基本的級別,以便在更大的字串中找到更小的搜尋模式。

到目前為止,我們已經瞭解了正則表示式和兩個特殊字元,即 . 號和 *(星號),但還有更多。

正則表示式三劍客

正則表示式包含三個主要的元件:

  • 字符集

  • 修飾符

這三個組成了...正則表示式三劍客!

我們先從錨點開始。

錨點

錨點指定圖案相對於線條的位置。這是兩個最重要的錨點:

  • ^(插入符號)將您的模式匹配到行的開頭。例如,模式^ 1匹配以1開頭的任何行。

  • $(美元)將您的模式匹配到句子的末尾。例如,9 $匹配任何以9結尾的行。

請注意,在這兩種情況下,模式必須分別在模式中的第一個和最後一個。^ 1在一行開頭匹配1,但1 ^匹配1後跟^。同樣,1 $匹配以1結尾的行,但$ 1匹配一個美元符號,後跟行上的任意位置1。

下一部分是字符集。

字符集

字符集是正則表示式的麵包和黃油。單個字元,比如a,是最原子的字符集(一個元素的集合)。但是我們可以使用像[0-9]那樣匹配任何單個數字的正則表示式來做瘋狂的事情,或者如果你還記得我們可以製作模式[0-9] [0-9] *(這個模式匹配的是什麼) 作為讀者的練習)。

其他一些重要的字符集:

  • [0-9] 匹配任意單個數字

  • [a-z] 匹配任意小寫字母

  • [A-Z] 匹配任意大寫字母

我們也可以合併多個字符集:

  • [A-Za-z0-9] 匹配任意大寫、小寫字母以及數字

修飾符

這裡我不想太深入的介紹,我們之前已經使用的  *(星號)是一個修飾符。修飾符會更改其前面字元的含義。還有許多其他修飾符,但從 * 開始比較容易理解。

一個具體的例子

首先我們快速生成一個包含某些文字的檔案:

$ echo "The cat jumps long time \nThen we also have the fact that these are words.\n1234 this is a test post please ignore." >> grep.txt

檔案內容如下:

$ cat grep.txt

The cat jumps long time
Then we also have the fact that these are words.
1234 this is a test post please ignore.

然後咱們搜尋一下 cat

$ grep "cat" grep.txt

The cat jumps long time

接下來我們搜尋任意以數字開頭的行

$ grep "^[0-9]" grep.txt

1234 this is a test post please ignore.

你剛剛就在使用正則表示式,是不是棒極了?

總結

在這篇文章中我們介紹了:

  • 正則表示式的基本功能

  • 正則表示式的三個主要的元件:錨點、字符集和修飾符

  • . (點), * (星號), ^ (插入符號) 以及 $ (美元符).

  • 一些字符集 [0-9], [a-z], [A-Z] 和字符集的合併

這篇博文的目的是通過插圖介紹使正則表示式更加容易理解。

如果你已經擺脫了正則表示式在技術上的困難,你最終就得到的是一個相對簡單但超級強大的工具。

給自己點贊吧,你已經沒資格當菜鳥了!

本文翻譯自 https://www.janmeppe.com/blog/regex-for-noobs/

圖文版請看公眾號“紅薯胡說”

相關推薦

如果一樣應該看看表示式指南

這是一篇正則表示式的圖解指南,這個指南適合那些從未擺弄過,剛開始想要學習正則表示式,卻被嚇了個半死的人(像我一樣)。對沒有受過正規

如果想搞懂“分散式鎖”必須要看文章 看了很意外!

對於鎖大家肯定不會陌生,在 Java 中 synchronized 關鍵字和 ReentrantLock 可重入鎖在我們的程式碼中是經常見的,一般我們用其在多執行緒環境中控制對資源的併發訪問。 但是隨著分散式的快速發展,本地的加鎖往往不能滿足我們的需要,在我們的分散式環境中上面加鎖的方法

[HDU 2520] 怕誰(不一樣的for迴圈)

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=2520 1 //學學不一樣的for迴圈 2 #include<iostream> 3 #include<cstdio> 4 #include<cmath> 5

怕誰

  Description lin2144是一隻小菜鳥,都是笨鳥先飛,lin2144想來個菜鳥先飛,他從0點出發 一開始的飛行速度為1m/s,每過一個單位時間lin2144的飛行速度比上一個單位時間的飛行速度快2m/s,問n (0 < n < 10^5)

【碼海座標】沒錯但是不會放棄努力

專欄達人 授予成功建立個人部落格專欄

【小橋流水的專欄】但是在慢慢地追著大牛的步伐。。。

博主簡介 南郵碩士畢業,現就職於奇虎360上海研發中心,研究演算法資料結構,C++,Python,Linux,Docker技術,安全准入技術,網路安全,服務計算。博主QQ:673771573

如果未曾深入瞭解python請先看看python簡史!

  python與人工智慧緊緊的聯絡在一起,現在很多年輕的開發者都開始學習Python,文章清晰且幽默的講述了python的發展史,希望對還在自學python的你有些幫助,或重拾自學python的激情。 學習Python中有不明白推薦加入交流群   &n

幾年 nuxt.js axios 封裝

nuxt.js axios 封裝 1,首先安裝axios npm install axios 2,在專案檔案pluginsw資料夾裡(哪個資料夾自己隨便啊)建立axios.js,程式碼如下: import axios from 'axios'//定義fetch函式,config為配置export fu

如果的shiro沒學明白應該看看文章將shiro整合進springboot

最小 3.2 開始 depend art tostring 登陸 string int 最近在做項目的時候需要用到shiro做認證和授權來管理資源 在網上看了很多文章,發現大多數都是把官方文檔的簡介摘抄一段,然後就開始貼代碼,告訴你怎麽怎麽做,怎麽怎麽做 相信很多小夥伴即使

(轉)清華博士王垠的退學申請——研究生無論想不想搞研究都該讀讀文章。

我覺得再沒有從實際出發的目標,我的研究就會完全變成紙張了,就像我高中感覺到的一樣。所以後來我就自己設立了一個研究方向,我把自己稱為“研 究博士生”,我要去了解博士生都是怎麼樣生活的。我就想知道有多少學生有跟我類似的困境。我跟很多朋友談過,去了解他們的苦衷,研究生也有,本科的也有。我覺得我還應該瞭解更多的人,就

replace限制文字框只能輸入數字數字和字母等的表示式

1.文字框只能輸入數字程式碼(小數點也不能輸入)  <input onkeyup="this.value=this.value.replace(/\D/g,'')" onafterpaste="this.value=this.value.replace(/\D/g,'')">&

java驗證”支援6-20個字母、數字、下劃線或減號以字母開頭“這個的表示式怎麼寫?

轉自:https://yq.aliyun.com/wenzhang/show_96854 問題描述 java驗證,”支援6-20個字母、數字、下劃線或減號,以字母開頭“這個的正則表示式怎麼寫? 驗證”支援6-20個字母、數字、下劃線或減號,以字母開頭“的正則表示式

#計算字串中所有數字和連續當一個數字 (表示式,能不用就不用)

s='12as3d6f20ads01sd02' import re def he(s): c=re.compile('\d+')#建立正則表示式 l=c.findall(s)#返回所有匹配結果的列表 sum=0 #和 for i in l: #遍歷

限制QLineEdit的數值輸入範圍(QT表示式方法)順便簡單介紹下QT表示式方法

首先看幾個例子: 1.限制浮點數輸入範圍為[-180,180] QRegexp rx("^-?(180|([1-9]?[0-9]|1[0-7][0-9])(\\.\\d)?)$"); QRegExpValidator *pReg = new QRegExpV

java 驗證 數字字母下劃線還有漢字的表示式和email

Java程式碼 34555#5' [\u4E00-\u9FA50-9a-zA-Z_] eiieng_89_ ---> eiieng_89_ _';'eiieng_88&*9_ --> _';'eiieng_88&*9_ _';'eiieng_88_&*9_ -->

只需體驗三分鐘就會一樣愛上款Toast

這可能是效能最優、使用最簡單,支援自定義,不需要通知欄許可權的吐司 已投入公司專案多時,沒有任何毛病,可勝任任何需求,點選此處下載Demo 想了解實現原理的可以點選此連結檢視:ToastUtils 原始碼 整合步驟 dependencies {

小說腦洞:《在一起就為了讓寫代碼?》

讓我 技術 love 女程序員 簡介 保留 原因 靈感 方便 簡介:一個其貌不揚的女程序員(很厲害),被一個帥哥瘋狂追求,原因竟然是為了學寫代碼? 風格:教學類。 篇幅:中篇。 開篇:一個帥哥偶遇一個女程序員(很厲害!),為了學習技術,出賣

小說腦洞:《在一起就為了讓寫程式碼?》

    簡介:一個其貌不揚的女程式設計師(很厲害),被一個帥哥瘋狂追求,原因竟然是為了學寫程式碼?     風格:教學類。     篇幅:中篇。     開篇:一個帥哥偶遇一個女程式設計師(很厲害!)

程序員大師神人 四個等級寫出代碼的區別.

python 程序 lte and odin mat env math odi # !/usr/bin/env python# -*- coding: utf-8 -*-# 據說係菜鳥,程序員,大師,神人 四個等級寫出代碼的區別...import math as m#for

如果不了解Petya與Wannacry的區別應該看看

blue 觀察 公司 cve 俄羅斯 設置 烏克蘭 目前 中毒 中毒現象 Petya(彼佳) 病不針對文件進行加密,病會修改系統的MBR引導扇區,重啟電腦後加密整個磁盤。 Wannacry(永恒之藍) 用戶中毒之後病會加密指定類型文件(文件類型包含上百種),然後設置