正規表達式知多少?試著取代對話中的單引號吧!(replace single quote with double quote)

前言

最近實在…自己的時間超少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的位置)

debuggex

這是一個圖像化的練習網站,可以將你寫的正規表達式以圖像的方式表現出來,對於初學時很有幫助。

問題一 : 解題

一步一步來,如果我們今天想取代所有的單引號,我們當然可以簡單的利用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+)?$

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s