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。
语法
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。
语法
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。
语法
参数值
参数 | 描述 |
---|---|
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() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串.
该方法不会改变原始字符串。
语法
参数值
参数 | 描述 |
---|---|
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() 方法不改变原始字符串。
语法
参数值
参数 | 描述 |
---|---|
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。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。
语法
参数值
参数 | 描述 |
---|---|
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转换成数字,然后再进行比较
/* 把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; } /* 把数值转换为ip,方法一 */ 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; } /* 把数值转换为ip,方法二 */ function num2ip2(number) { // Math.floor(x): 返回小于等于x的最大整数 var a = Math.floor(number / (256 * 256 * 256)); var b = Math.floor(number / (256 * 256) - a * 256); var c = Math.floor(number / (256) - a * 256 * 256 - b * 256); var d = Math.floor(number - a * 256 * 256 * 256 - b * 256 *256 - c *256); let ip = `${a}.${b}.${c}.${d}`; 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; }