原始題目如下:(7kyu)
An isogram is a word that has no repeating letters, consecutive or non-consecutive. Implement a function that determines whether a string that contains only letters is an isogram. Assume the empty string is an isogram. Ignore letter case.
翻譯:
單字中一個字母只出現一次(不分大小寫),回傳true。
範例:
isIsogram("Dermatoglyphics") == true
isIsogram("aba") == false
isIsogram("moOse") == false // -- ignore letter case
function isIsogram(str) {
let strArr = str.toLowerCase().split('').sort()
let result = true
strArr.forEach((item, index, arr) => {
if (item == arr[index + 1]) {
result = false
}
})
return result
}
先統一轉成大寫或小寫
、切割字串成陣列
並排序
,相同字母會被排在一起。
Ex: abaabb
--> aaabbb
使用forEach遍歷陣列,一一check與下一個元素是否相同。再度出現很冗的寫法
function isIsogram(str){
return !/(\w).*\1/i.test(str)
}
截至目前正規表示式
真的無所不在! 一行K.O.!
\w
: 找數字、字母及底線,等同於[a-zA-Z0-9_]
.*
.
:匹配任一字元 (換行除外)*
:匹配前一字元出現0~多次\1
:表示\w
擷取到的字元i
: 忽略大小寫function isIsogram(str){
return new Set(str.toUpperCase()).size == str.length;
}
使用到Set中不重複的特性!
以下內容及範例取自Javascript Info-Capturing groups
(...)
:
單獨抽出來
做使用量詞
範例1: 尋找gogogo
// go+ 代表 o這個字元緊接著g,且o出現1~多次
// go, gooo, gooooooo 都符合
//如果利用(),(go)+
// go, gogo, gogogogo都符合
範例2:尋找domain
mail.com
users.mail.com
smith.users.mail.com
規則是單字與單字之間以.
隔開
let regexp = /(\w+\.)+\w+/g;
// 可以想像成(word.)(word.)(word.)(word)的組合
// (word.)可以出現1~多次
()
分組也可以用\N
表示,N
為分組數字(引用、參考的概念),可以重複使用的感覺!
假設有一段文字需要把其中單引號或雙引號的內容擷取出來
let str = `He said: "She's the one!".`;
let regexp = /(['"])(.*?)\1/g;
// 再次參考到['"]
alert( str.match(regexp) ); // "She's the one!"
以上為今日分享的內容,若有錯誤或是建議,請再隨時和我聯繫。