正则——字符串完全匹配

时间:2019-03-19
本文章向大家介绍正则——字符串完全匹配,主要包括正则——字符串完全匹配使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

正则表达式完全匹配

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。

//s字符串
function isNumeric(s)
{
 
    let reg = /(\+|-)?\d*(\.\d+)?((E(\+|-)?|e(\+|-)?)?\d+)?\d*$/g;
    return s.search(reg) == 0 ;
	//或者
	return reg.exec(s)[0] == s ; 
	//exec返回数组的第一个是完全匹配成功的,如果等于s,即表示该字符串完全匹配

}

RegExp对象有两个方法:

reg.test(str);

test只要字符串中部分满足即返回true,所以这个题不能用test,因为1a3.14不是数字,但是3.14是满足的,它返回true,但答案是false。

reg.exec(str);

exec() 该方法检索字符串中的指定值。如果匹配成功,exec() 方法返回一个数组,并更新正则表达式对象的属性。
返回的数组将完全匹配成功的文本作为第一项,将正则括号里(即分组)匹配成功的作为数组填充到后面(匹配0个字符的undefined填充数组)。
如果匹配失败,exec() 方法返回 null。

let s = '1a3.14';
let reg = /(\+|-)?\d*(\.\d+)?((E(\+|-)?|e(\+|-)?)?\d+)?\d*$/g;
reg.exec(s);
//reg中有6个元组
["3.14", undefined, ".14", undefined, undefined, undefined, undefined]
关于字符串的操作
str.replace()
str.replace(regexp|substr, newSubStr|function)
该正则所匹配的内容(或者子字符串)会被第二个参数(或者函数)的返回值替换掉。

var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, function(match,p1,p2){
    return [p2,p1].toString();
});
或者:
var newstr = str.replace(re, "$2,$1");
// Smith, John
console.log(newstr);

使用字符串(newSubStr)作为参数时,可以插入特殊变量名

$$	插入一个 "$"。
$&	插入匹配的子串。
$`	插入当前匹配的子串左边的内容。
$'	插入当前匹配的子串右边的内容。
var newstr = str.replace(re, "$`");  //JohnJohnSmith
var newstr = str.replace(re, "$'");  //JohnSmithSmith

$n  选择插入第n个元组,n从1开始且小于100的非负数
str.match(regexp)

如果传入一个非正则表达式对象,则会隐式地使用 new RegExp(obj) 将其转换为一个 RegExp 。如果你没有给出任何参数并直接使用match() 方法 ,你将会得到一 个包含空字符串的 Array :[""] 。

如果正则表达式不包含 g 标志,str.match() 将返回与 RegExp.exec(). 相同的结果。

1、不加全局匹配时
var str = 'For more information, see Chapter 3.4.5.1';
var re = /see (chapter \d+(\.\d)*)/i;
var found = str.match(re);
var regF = re.exec(str);
console.log(found,regF);
//结果都是:["see Chapter 3.4.5.1", "Chapter 3.4.5.1", ".1"]
<!-- 第一个是完全匹配,第二个是'(chapter \d+(\.\d)*)'的捕获,第三个参数是 是被'(\.\d)'捕获的最后一个值 -->


2、加了全局匹配 g
var found = str.match(re); //["see Chapter 3.4.5.1"]
var regF = re.exec(str);  //["see Chapter 3.4.5.1", "Chapter 3.4.5.1", ".1"]

search()

返回第一个与 regexp 相匹配的子串的起始位置。

split() 切割字符串,返回数组
var Apple = 'iphone,ipad,ipadmini,mac,macpro';

console.log(Apple.split(','))       //["iphone", "ipad", "ipadmini", "mac", "macpro"]

console.log(Apple.split(/[^\,]+/));     //["", ",", ",", ",", ",", ""]

console.log(Apple.split(/[^\,]+/, 3));      //["", ",", ","]

Apple.split(/[^\,]+/)将非逗号作为分隔符,这里需要+匹配多个字符。
而之所以结果中的数组,第一项和最后一项是2个空字符串,是因为通过正则表达式指定的分隔符出现在了字符串的开头、末尾。
比如iphone分隔了""和逗号

Apple.split(/[^\,]+/, 3)是对分割后的数组进行再一次指定大小,所以返回的数组包含前3项。