前言
最近實在…自己的時間超少XD,感覺時間都花在交通或是家人身上。好不容易擠出的時間則都是在看一些技術文件或是一些談design pattern的書籍。其中在Eloquent Javascript關於regrex的章節看到了兩個蠻有意思的題目,於是在此做個簡單的紀錄。在進入說明前我們先看一下這兩個問題,可以試著思考一下如果是你,你會怎麼寫這樣的正規表達式。
問題一 : Quoting style
這是一個非常常見的情況,今天你希望將所有的單引號替換為雙引號,但在句中的單引號仍需要保留。請試著寫一個正規表達式達成以上的目標。
'Hi! I'm Danny.' => "Hi! I'm Danny"
工具使用
這是一些你可以使用的小工具,當然僅是作為輔助,若真的熟練的話這些東西完全非必要~!
Cheat Sheet
| \d | 匹配所有數字 |
| \D | 匹配所有非數字 |
| \w | 匹配所有數字、字母以及底線_ |
| \W | 匹配所有非數字、字母以及底線_ |
| \s | 匹配所有空格 |
| \S | 匹配所有非空格 |
| \b | 匹配所有文字邊界 |
| \B | 匹配所有非文字邊界(\Bis會匹配This is a book中position3的位置) |
這是一個圖像化的練習網站,可以將你寫的正規表達式以圖像的方式表現出來,對於初學時很有幫助。
問題一 : 解題
一步一步來,如果我們今天想取代所有的單引號,我們當然可以簡單的利用replace取代所有的單引號。
const demo_text = "'I am Danny'"
console.log(demo_text.replace(/'/g,'"')) // "I am Danny"
不過很明顯的,這並不適用於我們題目的要求,只要一個簡單的I’m Danny就破功了😂
所以我們需要在正規表達式下一點點功夫,我們需要的是確保匹配的單引號是字串的開頭或是結尾
/^'|'$/g
這樣看起來好多了。

不過這樣還是會有一點小問題,如果今天是一段對話,例如
let text = "'I'm the cook,' he said, 'it's my job.'"
很明顯光是開頭與結尾並不足以滿足我們的要求,於是建立在開頭與結尾的基礎上,我們還要加入匹配非文字字元的情況。
/(^|\W)'|'($|\W)/g
配合圖型示意圖應該就更清楚了!

結語
正規表達式一向是個易熟難精的東西,目前每次需要用到時我總是需要做一些查詢,之後可能需要再找時間重新寫一篇regrex的應用文章~!
額外加分 問題二 : Numbers again
我們都知道在javascript中有許多的數字表達方式,舉例來說以下都是JS中合法的數字。
- 0.5
- -11
- .3
- 1e5
- 1E-4
- 4E+6
試著寫一個正規表達式能匹配所有的合法數字。(以下是參考答案)
^[+-]?(\d+(.\d*)?|.\d+)([eE][+-]?\d+)?$