如何寫出乙個符合要求的正則

2022-08-05 15:45:11 字數 3291 閱讀 6324

如果你正在苦惱如何寫乙個正則的話,那麼或許本文對你有所幫助

文中的這個例子或許同個字串擷取同樣可以做到,但本文僅嘗試以純正則的角度解決問題

首先看一下這個例子

d             >> -    mj 1989

d - mj 2000>>

d - 17.05.2011>> - mj 2013

d - mj 2010>> - 01.11.2010

d - 24.06.2002>> - 25.08.2002

d - mj 2011>> - mj 2011

需求是獲取br標籤中的mj 2000或者25.08.2002這個字串;在>>這個左邊的是開始日期,右邊是結束日期,最後的結果需要給出開始年份和結束日期的字串,並且如果任意乙個日期為空,也需要提取出來,因為需要提取出的乙個是開始日期還是結束日期

在開始之前,我們假設一下我們最後可以的到的結果

分組1為開始年份 比如mj 2000或者為空串

分組2為開始年份 比如mj 2013或者為空串

好的 我們現在以這個結果去找尋可能的解決方案

首先我們可以觀察得到這樣的規律

這個字串以若干的

開頭和結尾,並且在開頭的

結束之後會有個d

那麼我們的開頭為^

(這個地方先假設只有乙個

),前文說到會有多個

,所以我們需要用量詞來形容,並且我們需要形容的是整個

所以需要用括號包裹起來,我們假設至少會有乙個

所以我們的式子變為^(

)+`接下來匹配開頭br 結束的d

式子為^(

)+`同理可得結尾式子應該是(

)+$然後我們先把首尾銜接起來,中間使用.*先匹配所有文字,同時使用分組包裹 即(.*)

^(

)+d(.*)(

)+$可以得到這樣的匹配結果

我們會發現實際上我們只是為了

這個標籤用量詞進行形容,我們並不關心他裡面是什麼值將需要從不分組上獲取到的,但是現在我們

現在可以從看到實際上我們將這個標籤的值獲取到了分組,並且占用了分組1的位置,導致我們的結果獲取到了不必要的文字(如果可以接受分組1 並不是我們需要的結果 也可以忽略)

所以我們使用非捕獲組(?:)來包裹乙個式子 用來表示這個我們只是想對整體進行一些操作,但是我們並不關心這個式子是什麼內容

所以我們的式子變成^(?:

我們也可以看到我們現在獲取到了整個除了br的文字內容

通過>>可以將文字內容分為開始時間和結束時間

所以分兩部分提取內容 式子為^(?:

可以看到每個匹配的項中都有且只有兩個分組,並且分組中含有我們需要的日期

那麼我們接下來需要做的就是在這個文字中提起我們需要的部分

先看左邊

有三種情況空的 、mj 2000以及24.06.2002 三種情況 並且存在一些空格

所以我們用(mj \d) 和 (\d.\d.\d) 和 () 三個分組提取內容

即()|(mj \d)|(mj \d)|(\d.\d.\d)

因為可能在日期之前存在空格或者橫槓 所以我們用[- ]+來匹配

接下來我們用[- ]*(()|(mj \d)|(mj \d)|(\d\.\d\.\d))來替換第乙個左邊的.*

得到^(?:

發現實際上再一次因為組的關係我們捕獲了整串左邊的文字,所以我們再次使用非捕獲組來修復這個問題

我們又發現實際上分組1和分組2是相同的內容

這個地方有兩種處理方式

第一種,將匹配每一種日期情況的分組去除或者改為非捕獲組

^(?:

)+d(?:[- ]*(|mj \d|\d\.\d\.\d))>>(.*)(?:

)+$^(?:

)+d(?:[- ]*((?:)|(?:mj \d)|(?:\d\.\d\.\d)))>>(.*)(?:

)+$第二種,將包裹所有日期可能的分組改為非捕獲組(這個地方可以思考測試一下為什麼不能把這個分組去除

無論哪種情況 都可以得到這個結果

同理將左邊的表達替換到右邊 就可以得到最後的結果

即分組1 是開始日期 分組2是結束日期

使用到的工具**

教你如何寫出乙個碎片輪播

對於幾乎每乙個入行前端的小夥伴來說,輪播圖幾乎都是必修課,但是,只是單純的切換過渡可能並不能滿足於你追求酷炫的心hh,那麼這裡就教你利用css3的clip path來模擬碎片並為你的輪播圖新增碎片輪播的效果!對於一張來說,如果在原有的基礎上新增一層蒙版,遮蔽住不想讓使用者見到的檢視,剩下的檢視即可作...

每日一題 14 找到符合要求的整數

問題描述 任意給定乙個正整數n,求乙個最小的整數m m 1 使得m n的十進位制結果只含有1和0 問題解答 1.窮舉法 for m 2 m 一旦n較大,比如n 99,m 1122334455667789,m n 111,111,111,111,111 2.問題轉換 原問題可以轉化為 求乙個只含有1與...

如何寫出乙個好的單例模式

單例模式是設計模式中總容易理解,並且使用次數比較多的模式,往往在面試中會被問到。在這裡我簡述下自己的思路。希望能對你有所幫助。懶漢式 單例模式 public class single public static single getinstance return instance 複製 上面這種,是...