1. 程式人生 > 其它 >JavaScript RegExp 物件 -- 正則(ip轉換數字、域名提取)、毫秒轉為日期-天時分秒

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; 
}