各位大神請教一下
目前在撰寫一段針對台灣這邊市話的正規表達式
目的是要套用到DLP產品中偵測文件中有無相關的PII(個資)的內容
以下是我目前寫的表達式
(0[2-8]\d{0,2}|\(0[2-8]\d{0,2}\))(\s|-)?\d{1,4}(\s|-)?\d{4}
09\d{2}(\s|-)?\d{3}(\s|-)?\d{3}
以上分別為辨識市話&手機號碼的表達式
採用的程式語言不確定,DLP原廠沒有透漏是採用哪一種程式語言,不過目前用regex101提供的各種語言結果都相同。
主要是參考了維基百科中這篇關於台灣區域市話的文章
文章連結-中華民國電話號碼
目前的結果是該辨識到的都有抓出來,但誤判率過高
範例:
正常情況下可以抓出
02-2345-6789,(02) 2345-6789,0912-345-678 這幾種形式的電話號碼表示方法
但對於一些像是含有02開頭字串也可能被誤判,例如143022345678941就會被誤判。
有想過在表達式開頭與結尾中加入"^"或"$"來限制比對的字串
但這又會造成如果要比對的字串電話號碼不是在這一行的開頭就比對不到,例如"我的號碼是02-2345-6789"就比對不出來。
目前DLP的產品是有方法可以設定說 偵測超過多少筆才將檔案定義為機敏資料,不過這部分又要拿捏可能會漏抓一些檔案。
想請問各位大神如果單純針對正規表達式的撰寫方式,有什麼方法可以改進誤判率,或是有其他種類的寫法也可以一起分享,感謝!!!
我抄考了樓上的大大,做了一個javascript program, 可是做到宜蘭已經受不了,太累了
let reg02=/\b(\(?02\)?)-?([238]\d{3})|((55|66|77)\d{2})-\d{4}\b/;
let reg03=/\b(\(?03\)?)-?(((2[567]|6[012])\d{2})|(80[05])|(90[06])|910|890)-\d{4}\b/;
let data=['143022345678941','02-2345-6789','(02)2345-6789','023800-0000','410238000000','024556-6983','(02)4556-6983','026644-6983','025546-6983','(02)-8452-7861','4028001-9877','028001-9877','032567-8941','032657-8941','03274-8941','036102-8941','036302-8941','(03)6002-8941','03724-4466','13724-4466','03800-4871','03804-4871','03805-4871','(03)800-4871','(03)890-4871','03891-4871','03890-4871','03900-4871','03906-4871','03910-4871','(03)910-4871','(03)901-4871','(03)910-48714545'];
let result=document.getElementById("result");
result.innerHTML="";
data.forEach(d=>{
result.innerHTML+="================================<br>";
result.innerHTML+=d+"="+reg02.test(d)+"<br>";
result.innerHTML+=d+"="+reg03.test(d)+"<br>";
result.innerHTML+="================================<br>";
});
online demo:
https://jsfiddle.net/8qdy1wfu/