2022年3月28日 星期一

手機號碼的正規表達式

 手機號碼的正規表達式

前言

  最近寫了手機號碼的正規表達式,在此做個紀錄。


內容

  在網上搜尋會達到以下

^09[\d]{8}$


不過這個病不支援以+886開頭的格式,所以我改成以下

^(09|\+886)[\d]{8}$


這是我第一次用"|",要記得把內容用"()"區隔和後面的連續 8 個數字,並記得 +886 的"+"要在前面補一個"\",不然會跟正規表達式的"+"混淆。


參考資料

[ coding.tools ] 正則表達式在線測試工具

2022年3月21日 星期一

關於 E-mail 的正規表達式

 關於 E-mail 的正規表達式

前言

  最今寫了 E-mail 的正規表達式,但上網查了一下答案遽然和我想得不太一樣,仔此把學習的過程做個紀錄。


內容

  首先我認為 E-mail 的正規表達式如下

^([a-z0-9_\.-]+)@([\da-z\.-]+)$


可以使用之前的工具 線上使用正規表達式 來驗證,如下圖

我認為 E-mail 的正規表達式


但上網對了一下答案發現遽然不一樣,答案如下

^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$


前半段是一樣的,不一樣的部分在最後的部分,也就是最後的網域一定是由 2~6 的字所組成,只能說還好我有對答案,不然就只能等原本的寫法發生問題才能發現了。


參考資料

[ www.fooish.com ] Regex Examples


相關文章與資料

線上使用正規表達式


2022年3月14日 星期一

考慮使用 Decimal 來解決精度的問題

 考慮使用 Decimal 來解決精度的問題

前言

  最近在 Python 發生 round() 無法正常四捨五入的問題,在網上查詢後發現 Python 的 float 會有精度的問題,在此把學習的過程做個紀錄。


內容

  範例如下

from decimal import Decimal,ROUND_HALF_UP
print(round(1.115, 2) )#1.11
print(Decimal('1.115').quantize(Decimal('.00'), ROUND_HALF_UP) )#1.12


1.115 在作 round() 會期望得到 1.12 ,但事實上卻是 1.11 ,要解決這個問題要透過 decimal 模組提供的 Decimal 來處理精度的問題,要四捨五入時透過 quantize()  來完成,這樣就可以得到期望的 1.12 。


參考資料

[ kirin.idv.tw ] Python – decimal 模組教學 – 四捨五入的正確作法

2022年3月7日 星期一

JavaScript 2022 在正規表達式的新標準

前言

  最近發現 JavaScript 2022 有對正規表達式新增寫法,抽空做個學習,在此做個紀錄。


內容

  JavaScript 2022 有新增一個"d"的旗標給正規表達式,可以方便取得結果的文字的開頭與結尾,在先前的 在 JavaScript 的正規表達式取得比對結果的索引值 用的方法僅能找到開頭,範例如下

const regexp = /test\d/g; //without the /d flag
const regexp2022 = /test\d/dg; //with the /d flag
const str="test1test2";
const array = [...str.matchAll(regexp)];
const array2022 = [...str.matchAll(regexp2022)];
console.log(array[0].indices);//undefined
console.log(array2022[0].indices);//[[0, 5]]


使用的方法就是在正規表達式上加一個"d"的旗標,這樣回傳結果時會多一個"indices"的變數,跟之前在 在 JavaScript 的正規表達式取得比對結果的索引值 用"index"做發法不同,"index"僅有開頭並不包結尾,"indices"則會包含開頭與結尾。


參考資料

[ prog.world ] Work Proposals Included in the Coming ECMAScript 2022 Standard for JavaScript 


相關文章與資料

在 JavaScript 的正規表達式取得比對結果的索引值

2022年2月28日 星期一

在 Python 比對中文字串

 在 Python 比對字串

前言

  以前一直有不要在 Python 處理中文的印象,但最近發現 Python3 以後對中文字串已改善,並順便做個學習,在此做個紀錄。


內容

  最近都在用正則表達式,發現就算用中文有沒太大的問題,但那是 JavaScript ,在 Python 也是如此嗎?就結果來說是的,由於我入門 Python 時是在  2 的時期,那時的中文處理很麻煩加上當時我用不到,所以留下了盡量不要用 Python 來處理中文字串的印象,但最近一查發現 Python3 以後對於中文字串處理就變得相當友善,實際範例如下

str = '一'
if str == '一':
    print('equal')
if str in '一二':
    print('contained')
print(str.find('一二')!=-1)#False


要比對字串是否相等時使用"=="就可以,第二個應用是使用"in"來確定字串是否在某個字串裡,這個用法非常直覺,第三個應用是使用"find()",但要注意"find()"的結果是回傳字串的索引值,如果找不到匯回傳"-1"。


參考資料

[ blog.csdn.net ] python 中文字符串比较

2022年2月21日 星期一

用正則表達式檢查中文

 用正則表達式檢查中文

前言

  最近想了一下正則表達式的一些應用,發現似乎沒用過它來檢查中文過,所以就抽空來研究一下,在此做個紀錄。


內容

  這次會使用到 [ coding.tools ] 正則表達式在線測試工具 來做為驗證,如何使用可以參考 線上使用正規表達式。實驗了一下發現遽然可以直接輸入,如下圖

用正則表達式檢查中文

本以為這是線上工具的貼心設計,所以我實際打了個程式碼來驗證,如下

const reg = /一二/g;
let s = '一二..';
console.log( reg.test(s) );//true


結果正確,真的可以直接輸入!如果要檢查所有的中文字可以用 [/u4e00-/u9faf] 來檢查一個中文字。


  不知是不是我對 JavaScript 的偏見,總是認為在 JavaScript 使用中文位很麻煩,必須不斷把字串轉成字碼再搭配"\u"來表達,但現在的 JavaScript 遽然可以直接就檢查中文,真是讓我改觀了。


參考資料

[ coding.tools ] 正則表達式在線測試工具

[ www.itread01.com ] 匹配中文字符的正則表達式: [/u4e00-/u9fa5]


相關文章與資料

線上使用正規表達式

2022年2月14日 星期一

線上使用正規表達式

 線上使用正規表達式

前言

  每次使用正規表達式都要打程式碼會不會覺得很麻煩呢?這次介紹可以在線上使用正規表達式,而且可以馬上得到結果,不須像打程式碼還要按"Run"得到結果,在此做個紀錄。


內容

  使用的線上工具式是 [ coding.tools ] 正則表達式在線測試工具 ,使用的畫面如下

正規表達是在線測試工具的使用畫面


在畫面"1"處輸入正規表達式,在畫面"2"處就是要檢查的內容,工具會把符合的結果反白,這是即時的不須按下任何的按鍵,用起來相當直覺簡單。


  接著提供一些常用的技巧,如果要檢查不是多行,只是單行字串符合某種格式的的話,可以參考以下

^ *ABC *$


上述的例子會檢查去頭尾空白並且中間有"ABC",利用"^"與"$"來放頭尾即可,如果要檢查多行的結果這就不適合,之前的 用正規表達式檢查IP 就有使用這個方法。善用"[]"來限制符合條件的字元,如果要檢查字母後有數字的結果可以使用以下

[A-Za-z]+\d+


範例限定大小字母才能符合資格,接著要搭配"+","+"指的是前面的結果至少出現 1 次,如果有需要還可以搭配"*"與"?","*"是指前面的結果出現 0 次或多次,"?"是指前面的結果出現 0 次或 1 次。如果要檢查帶有小數的數字可以用以下

\d+(.\d+)?


這次要使用"()"來包覆結果,並搭配檢查次數的"?"(檢查前面的結果出現 0 次或 1 次)。如果要檢查"()"包覆的內容可以用以下

\(.*\)


利用"\"後加特殊字元來表明"()",範例中的"."指的是任意字元,所以".*"就可以解釋成任意字元出現 0 次或多次。


參考資料

[ coding.tools ] 正則表達式在線測試工具


相關資料與文章

用正規表達式檢查IP