正则表达式完全匹配
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+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项。