简单的练习:
题目
- 与搜索字符串开始处的 3 个数字匹配。
- 与除 a、b 和 c 以外的任何字符匹配。
-
'1234567'.match(/\d{1,3}/g)
的结果。 - 不以“th”开头的单词匹配。
- 对密码应用以下限制:其长度必须介于 4 到 8 个字符之间,并且必须至少包含一个数字。
- 匹配一个中文字符。
答案
与搜索字符串开始处的 3 个数字匹配:/^\d{3}/
。
与除 a、b 和 c 以外的任何字符匹配:/[^abc]/
。
‘1234567’.match(/\d{1,3}/g),根据贪婪原则,结果是["123","456","7"]
。
不以“th”开头的单词匹配:/\b(?!th)\w+\b/
。
对密码应用以下限制:其长度必须介于 4 到 8 个字符之间,并且必须至少包含一个数字:/^(?=.*\d).{4,8}$/
。首先.{4,8} 表示与包含 4-8 个字符的字符串匹配;然后.*表示单个字符(除换行符 \n 外)零次或多次,且后面跟着一个数字,注意(?=)只匹配一个位置。
匹配一个中文字符:/[\u4e00-\u9fa5]/
。
当然,可能答案不唯一,不必较真啦~ 主要目的是回忆熟悉一下语法~
如果还不了解正则,可以前往正则表达式理论篇了解哇~
真正的实践来了
要想在复杂性和完整性之间取得平衡,一个重要因素是要了解将要搜索的文本。
好的正则表达式:
- 只匹配期望的文本,排除不期望的文本;
- 易于控制和理解;
- 保证效率。
有时候处理各种极端情况会降低成本/收益的比例。所以某些情况下,不完全依赖正则表达式完成全部工作,比如某些字段用子表达式()括起来,让内存记忆下来,然后再用其他程序来验证。
不过本文还是从学习正则的角度出发,全部依赖正则表达式来写的哇~~
匹配美元 正则表达式:/^\$[0-9]+(\.[0-9][0-9])?$/
。
分为四部分:
-
^\$
以美元符号开头。
-
[0-9]+
至少包含一个数字。
-
(\.[0-9][0-9])?
由一个点和两位数组成,匹配0次或1次,因为可能是整数或者是小数。
-
$
最后的$表示以数字结尾的。
缺点:不能匹配$1,000
匹配24小时制的时间,比如 09:59
- 小时部分
方法一:分类逻辑为第一个数字(0、1、2),可以分为三部分:上午 00点到09点(0可选);白天10到19点;晚上20到23点。
因此有三个多选分支,得到的结果为:
/^\d{3}/
。/[^abc]/
。["123","456","7"]
。/\b(?!th)\w+\b/
。/^(?=.*\d).{4,8}$/
。首先.{4,8} 表示与包含 4-8 个字符的字符串匹配;然后.*表示单个字符(除换行符 \n 外)零次或多次,且后面跟着一个数字,注意(?=)只匹配一个位置。/[\u4e00-\u9fa5]/
。如果还不了解正则,可以前往正则表达式理论篇了解哇~
好的正则表达式:
/^\$[0-9]+(\.[0-9][0-9])?$/
。
分为四部分:
-
^\$
以美元符号开头。 -
[0-9]+
至少包含一个数字。 -
(\.[0-9][0-9])?
由一个点和两位数组成,匹配0次或1次,因为可能是整数或者是小数。 -
$
最后的$表示以数字结尾的。
缺点:不能匹配$1,000
匹配24小时制的时间,比如 09:59
- 小时部分
方法一:分类逻辑为第一个数字(0、1、2),可以分为三部分:上午 00点到09点(0可选);白天10到19点;晚上20到23点。
因此有三个多选分支,得到的结果为:
|
|
还可以优化一下,合并前面的两个多选分支,得到:
[
01]?[
方法二:分类逻辑为第二个数字,可以分为两部分:[0-3]和[4-9]。为什么这么分?看看下面这个图就知道了,[0-3]多了一行(以2为第一个数字):
因此有两个多选分支,结果为:
分钟数比较简单,第一个数范围在0-5之间,第二个数在0-9之间,因此得到分钟数为:
小时部分用(?:)包起来,起到一个分组的作用,且不保存匹配项;
其实这个结果不能说完全正确,首先你要明白这个正则用在什么地方,比如是数据验证或者 情景一:填写表单中的字符串必须为24小时制的时间,那么可能第一个 情景二:用于复杂的字符串搜寻替换时,可能也会匹配这样子的字符串如’跑步用时19:50’,明显的,’19:50’表示19分50秒,而不是表示24小时制的时间19点50分。 匹配IP地址 IP地址的规则:点号分开的四个字段,每个字段在0-255之间。
我们稍微合并一下这三个多选分支,得到:
我们再来看以2开头的三位数: 第二位数小于5的时候,第三位数范围[0-9]都可以;第二位数等于5的时候,第三位数范围[0-5] ,因此得到两个多选分支:
前两步合并起来,得到一个字段0-255的表示方法:
为什么第2个才是对的呢?我们看一下返回的input属性就了解了:
验证2:
|
如果三位数,那么以0或者1开头的三位数也是合法的,即000-199。
1
2
3
4
5
6
7
8
9
|
" U'.match(/"(?:\\.|[^
"])*"/);
// 结果与期望符合:[""
"x3\\""]
// input: "I
"start \"x3\\"
" U"
// [^
"]和\\.的位置调换
'I "
"]|\\.)*"/);
// 结果与期望不符合:[""
"x3\\"]
//
input:
[^"] 和\\. 的位置调换后,结果与期望不符合。那是因为[^"] 匹配start \ 后,遇到紧接着的" 不匹配,交给后面的多选分支\\. ,也不匹配,又刚好结束分隔符是 因此两个正则之间 正确的正则是
|