JavaScript RegExp 物件 -- 正則(ip轉換數字、域名提取)、毫秒轉為日期-天時分秒
一、JS中的正則物件
原文:https://www.runoob.com/jsref/jsref-obj-regexp.html
var patt = new RegExp(pattern,modifiers); 或 var patt = /pattern/modifiers;
modifiers 修飾符,即匹配模式如下:
修飾符 | 描述 |
---|---|
i | 執行對大小寫不敏感的匹配。 |
g | 執行全域性匹配(查詢所有匹配而非在找到第一個匹配後停止)。 |
m | 執行多行匹配。 |
// 如果需要常規的字元轉義規則(在前面加反斜槓 \)。 // 注意,如果是new的形式,需要兩個斜杆 \\ 而簡便的/ /模式只需要一個斜杆 \,以下是等價的:var re1 = new RegExp("www\\.baidu\\.com"); var re2 = /www\.baidu\.com/;
二、RegExp 物件方法
方法 | 描述 |
---|---|
exec | 檢索字串中指定的值。返回找到的值,並確定其位置。 |
test | 檢索字串中指定的值。返回 true 或 false。 |
toString | 返回正則表示式的字串。 |
1、exec
原文:https://www.runoob.com/jsref/jsref-exec-regexp.html
exec() 方法用於檢索字串中的正則表示式的匹配。
如果字串中有匹配的值返回該匹配值(陣列),否則返回 null。
語法
RegExpObject.exec(string)var str = "Hello world!"; // 查詢"Hello",exec返回的是陣列 var patt = /Hello/g; var result = patt.exec(str); console.log("結果: " + result[0]); // 查詢 "dog" var str2 = "Hello Dog" var patt2 = new RegExp("dog", "i"); var result2 = patt2.exec(str2); console.log("結果: " + result2[0]); /*結果: Hello 結果: Dog */
2、test
原文:https://www.runoob.com/jsref/jsref-test-regexp.html
test() 方法用於檢測一個字串是否匹配某個模式.
如果字串中有匹配的值返回 true ,否則返回 false。
語法
RegExpObject.test(string)var str = "Hello world!"; // 查詢"Hello",test返回值是布林值 var patt = /Hello/g; var result = patt.test(str); console.log("結果: " + result); //查詢 "dog" var str2 = "Hello Dog" var patt2 = new RegExp("dog", "i"); var result2 = patt2.test(str2); console.log("結果: " + result2); /* 結果: true 結果: true */
3、toString
原文:https://www.runoob.com/jsref/jsref-regexp-tostring.html
用於返回正則表示式的字串值
var patt = new RegExp("zzz", "g"); var res = patt.toString(); // "/zzz/g"
三、RegExp 物件屬性
屬性 | 描述 |
---|---|
constructor | 返回一個函式,該函式是一個建立 RegExp 物件的原型。 |
global | 判斷是否設定了 "g" 修飾符 |
ignoreCase | 判斷是否設定了 "i" 修飾符 |
lastIndex | 用於規定下次匹配的起始位置 |
multiline | 判斷是否設定了 "m" 修飾符 |
source | 返回正則表示式的匹配模式 |
var patt = new RegExp("zzz", "g"); patt.lastIndex // 0 patt.global // true patt.ignoreCase // false patt.multiline // false patt.source // "zzz"
四、支援正則表示式的 String 物件的方法
方法 | 描述 |
---|---|
search | 檢索與正則表示式相匹配的值。 |
replace | 替換與正則表示式匹配的子串。 |
split | 把字串分割為字串陣列。 |
match | 找到一個或多個正則表示式的匹配。 |
1、search
原文:https://www.runoob.com/jsref/jsref-search.html
search() 方法用於檢索字串中指定的子字串,或檢索與正則表示式相匹配的子字串。
如果沒有找到任何匹配的子串,則返回 -1。
語法
string.search(searchvalue)引數值
引數 | 描述 |
---|---|
searchvalue | 必須。查詢的字串或者正則表示式。 |
返回值
型別 | 描述 |
---|---|
Number | 與指定查詢的字串或者正則表示式相匹配的 String 物件起始位置。 |
var str = "my name is Zzbj"; str.search("z"); // 找到小寫的z,返回12 str.search(/z/i); // 使用正則,忽略大小寫,找到大寫的Z,返回11 var r = new RegExp("z+"); str.search(r); // 找到小寫的z,返回12
2、replace
原文:https://www.runoob.com/jsref/jsref-replace.html
定義和用法
replace() 方法用於在字串中用一些字元替換另一些字元,或替換一個與正則表示式匹配的子串.
該方法不會改變原始字串。
語法
string.replace(searchvalue,newvalue)引數值
引數 | 描述 |
---|---|
searchvalue | 必須。字串或者正則regexp物件。 |
newvalue | 必需。一個字串值。規定了替換文字或生成替換文字的函式。 |
返回值
型別 | 描述 |
---|---|
String | 一個新的字串,是用 replacement 替換了 regexp 的第一次匹配或所有匹配之後得到的。 |
var str = "you are a big big pig"; var str_res = str.replace("big", "small"); // "you are a small big pig" var reg_res = str.replace(/big/g, "small"); / "you are a small small pig"
3、split
原文:https://www.runoob.com/jsref/jsref-split.html
定義和用法
split() 方法用於把一個字串分割成字串陣列。
提示:如果把空字串 ("") 用作 separator,那麼 stringObject 中的每個字元之間都會被分割。
注意:split() 方法不改變原始字串。
語法
string.split(separator,limit)引數值
引數 | 描述 |
---|---|
separator | 可選。字串或正則表示式,從該引數指定的地方分割 string Object。 |
limit | 可選。該引數可指定返回的陣列的最大長度。如果設定了該引數,返回的子串不會多於這個引數指定的陣列。如果沒有設定該引數,整個字串都會被分割,不考慮它的長度。 |
返回值
型別 | 描述 |
---|---|
Array | 一個字串陣列。該陣列是通過在 separator 指定的邊界處將字串 string Object 分割成子串建立的。返回的陣列中的字串不包括 separator 自身。 |
var str = "hello my big pig"; var res_all = str.split(" "); // ["hello", "my", "big", "pig"] var res_2 = str.split(" ", 2); // ["hello", "my"] var str2 = "helloabcmyabcpig"; var res_reg = str2.split(/abc/); // ["hello", "my", "pig"]
4、match
原文:https://www.runoob.com/jsref/jsref-match.html
match() 方法可在字串內檢索指定的值,或找到一個或多個正則表示式的匹配。
match() 方法將檢索字串 String Object,以找到一個或多個與 regexp 匹配的文字。這個方法的行為在很大程度上有賴於 regexp 是否具有標誌 g。如果 regexp 沒有標誌 g,那麼 match() 方法就只能在 stringObject 中執行一次匹配。如果沒有找到任何匹配的文字, match() 將返回 null。否則,它將返回一個數組,其中存放了與它找到的匹配文字有關的資訊。
語法
string.match(regexp)引數值
引數 | 描述 |
---|---|
regexp | 必需。規定要匹配的模式的 RegExp 物件。如果該引數不是 RegExp 物件,則需要首先把它傳遞給 RegExp 建構函式,將其轉換為 RegExp 物件。 |
返回值
型別 | 描述 |
---|---|
Array | 存放匹配結果的陣列。該陣列的內容依賴於 regexp 是否具有全域性標誌 g。 如果沒找到匹配結果返回null。 |
var str = "I am handsome boy very handsome"; var res = str.match(/handsome/gi); // ["handsome", "handsome"]
五、如何判斷某ip地址是否在指定的ip地址段範圍內
我們可以先把IP轉換成數字,然後再進行比較
function ip2num(ip) { let ip_array = ip.split("."); let number = parseInt(ip_array[0]) * 256 * 256 * 256 + parseInt(ip_array[1]) * 256 * 256 + parseInt(ip_array[2]) * 256 + parseInt(ip_array[3]); return number; } function num2ip(number) { // Math.floor(x): 返回小於等於x的最大整數 let ip = Math.floor(number / (256 * 256 * 256)) + "." + Math.floor(number % (256 * 256 * 256) / (256 * 256)) + "." + Math.floor(number % (256 * 256) / 256) + "." + Math.floor(number % 256); return ip; } var ip = "127.0.0.2"; var target_ip = "127.0.0.1-127.0.0.10"; var target_1 = target_ip.split("-")[0]; var target_2 = target_ip.split("-")[1]; if (ip2num(ip) >= ip2num(target_1) && ip2num(ip) <= ip2num(target_2)) { // 滿足條件 console.log("success"); } else { console.log("failed"); }
六、從字串中擷取相應的域名
var reg = /[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+\.?/; var host = reg.exec("http://www.test.com:9000/article/p/2"); console.log(host[0]);
七、毫秒轉為日期:天時分秒
// 毫秒轉為日期:天時分秒 function getDuration(millisecond) { var time = ""; var days = millisecond / 1000 / 60 / 60 / 24; var daysRound = Math.floor(days); var hours = millisecond / 1000 / 60 / 60 - 24 * daysRound; var hoursRound = Math.floor(hours); var minutes = millisecond / 1000 / 60 - 24 * 60 * daysRound - 60 * hoursRound; var minutesRound = Math.floor(minutes); var seconds = millisecond / 1000 - 24 * 60 * 60 * daysRound - 60 * 60 * hoursRound - 60 * minutesRound; if (daysRound) { time = daysRound + "天"+ hoursRound + "小時"+minutesRound + "分鐘"; } else if (!daysRound && hoursRound) { time = hoursRound + "小時"+minutesRound + "分鐘"; } else if (!daysRound && !hoursRound && minutesRound) { time = minutesRound + "分鐘"; } else if (!daysRound && !hoursRound && !minutesRound && seconds) { time = seconds + "秒"; } return time; }