通过剑指第二十题学习javascript正则表达式

之前用正则都是临时偶尔看一下,没有正式的学习过。
这次碰到剑指第20题,十分感兴趣,也觉得要正式系统学习一下正则了。
题目愿意是:
链接:https://www.nowcoder.com/questionTerminal/6f8c901d091949a5837e24bb82a731f2
来源:牛客网

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

看到牛客网网友 “今天吃啥”给出了一个很精妙的正则

//s字符串
function isNumeric(s)
{
    return s.search(/^[+-]?\d*(\.\d*)?$/)==0||s.search(/^[+-]?\d+(\.\d*)?[Ee]{1}[+-]?\d+$/)==0;
}

虽然后面我发现了一些特殊测试用例问题 ,但是不妨先就这这个正则学习一下。

正则的一些方法

摘选自 https://www.runoob.com/js/js-regexp.html
search() 方法 用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。

var str = "Visit Runoob!"; 
var n = str.search(/Runoob/i);

replace() 方法 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

var str = document.getElementById("demo").innerHTML; 
var txt = str.replace(/microsoft/i,"Runoob");

test() 方法是一个正则表达式方法。
test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
以下实例用于搜索字符串中的字符 “e”:

var patt = /e/;
patt.test("The best things in life are free!");

修饰符

i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

正则表达式模式

摘录自 https://www.cnblogs.com/mq0036/p/4836439.html
代码 等同于 匹配
. IE下[\n],其它[\n\r] 匹配除换行符之外的任何一个字符
\d [0-9] 匹配数字
\D [^0-9] 匹配非数字字符
\s [ \n\r\t\f\x0B] 匹配一个空白字符
\S [^ \n\r\t\f\x0B] 匹配一个非空白字符
\w [a-zA-Z0-9_] 匹配字母数字和下划线
\W [^a-zA-Z0-9_] 匹配除字母数字下划线之外的字符

量词(下表量词单个出现时皆是贪婪量词)

代码 描述
" * “匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。 * 等价于{0,}。
“+” 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 中的"do” 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。刘, “o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。

以上整理完毕,让我们来看几个例子

var reg = /^\d+\.\d+$/  //是否带有小数。
//\d+代表一个或者多个数字, 然后是转义符 . , 最后匹配 一个或者多个数字。

var reg = /^[0-9]{8}$/   //是否八位数字组成
var reg= /^((0\d{2,3}-\d{7,8})|(1[3584]\d{9}))$/;  //电话格式
//这里用到了分支条件 | ,要么匹配前面固定电话,要么匹配后面手机。
var reg=/^\w+@[a-zA-Z0-9]{2,10}(?:\.[a-z]{2,4}){1,3}$/;   //邮件地址
// \w+ 匹配邮箱前面数字或者字符, [a-zA-Z0-9]{2,10} 匹配hotmail或者gmail**, 后面有点不懂,待更新**

最后看这道题的正则

//s字符串
function isNumeric(s)
{
    return s.search(/^[+-]?\d*(\.\d*)?$/)==0||s.search(/^[+-]?\d+(\.\d*)?[Ee]{1}[+-]?\d+$/)==0;
}

前一个search匹配的是 +12.231,+12, 23 , +.123(这个是不是有问题)
后一个search匹配的是 -3.34e+23,5e2 ,但是也有问题 +4.e23也返回true。

猜你喜欢

转载自blog.csdn.net/weixin_39285712/article/details/89926985