5日 六月 2019

字符串的开始符 ^ 和结束符 $

脱字符 '^' 和美元符 '$' 在正则表达式中有特殊的含义,它们被叫做 “锚”。

脱字符 ^ 匹配文本的开始,而美元符 $ 匹配文本的结束。

举个例子,让我们来匹配以 Mary开头的文本:

let str1 = "Mary had a little lamb, it's fleece was white as snow";
let str2 = 'Everywhere Mary went, the lamp was sure to go';

alert( /^Mary/.test(str1) ); // true
alert( /^Mary/.test(str2) ); // false

这个正则表达式 ^Mary 意味着(匹配的是):“字符串的开始然后是 Mary”。

现在让我们匹配所有以一个 email 结尾的文本:

为了去匹配一个 email,我们可以使用 [-.\w]+@([\w-]+\.)+[\w-]{2,20} 这个正则表达式,它不是完美的,但是大多数情况下都可以正常工作。

为了匹配以 email 结尾的文本,让我们给这个正则表达式添加一个 $ 吧:

let reg = /[-.\w]+@([\w-]+\.)+[\w-]{2,20}$/g;

let str1 = 'My email is mail@site.com';
let str2 = 'Everywhere Mary went, the lamp was sure to go';

alert( reg.test(str1) ); // true
alert( reg.test(str2) ); // false

我们可以同时使用这两个符号,来检查字符串是不是完全匹配正则表达式。这经常用于信息校验。

举个例子,我们想去确认一个 字符串 是以 # 加上6个十六进制数字所表示颜色。这个颜色字符串的模式是 #[0-9a-f]{6}

要检查 整个字符串 完全匹配正则表达式的模式,我们需要加上 ^...$

let str = "#abcdef";

alert( /^#[0-9a-f]{6}$/i.test(str) ); // true

正则表达式的引擎会先找到文本的开始,然后匹配颜色字符串,然后查看文本是否在字符串之后立即结束。这样子正是我们所想要的。

锚的长度为零

锚就像 \b 一样,是测试时的一个字符,他们没有长度。

换句话说,它们不会检验到一个字符,但是它们会让正则表达式的引擎去检查判定条件(例如是否处于文本开头/结尾)。

当正则表达式有一个 m(多行模式)flag 时,这些锚的性质会发生改变。我们将会在下一章讨论它。

任务

什么字符串可以匹配模式 ^$

唯一一个匹配的字符串是空字符串:它的开始紧跟着结束。

这个题目再一次说明了锚不是一个字符串,而是一个测试。

对于空字符串 "",正则表达式引擎将会首先匹配模式 ^(输入开始),匹配成功之后,会紧跟着检查模式 $,也匹配成功。所以空字符串是匹配 ^$ 的。

作为互联网接口的 MAC 地址 包括了 6 个以冒号 : 分隔的两位十六进制数。

举个例子:'01:32:54:67:89:AB'

请写一个能检查所有 MAC 地址的正则表达式。

用法:

let reg = /your regexp/;

alert( reg.test('01:32:54:67:89:AB') ); // true

alert( reg.test('0132546789AB') ); // false(缺少冒号)

alert( reg.test('01:32:54:67:89') ); // false(只有 5 个数字,必须是 6 个数字)

alert( reg.test('01:32:54:67:89:ZZ') ) // false(ZZ 不是合法的十六进制)

两位十六进制数的模式是 [0-9a-f]{2}(假设 i flag 已被启用)。

我们需要一个 NN 这种形式的数字,后面还需要五个 :NN 形式的数字。

最终的正则表达式是:[0-9a-f]{2}(:[0-9a-f]{2}){5}

现在让我们看看此模式如何匹配整个文本:从 ^ 处开始,到 $ 这里结束。通过将匹配模式包裹在 ^...$ 来完成的。

最终结果:

let reg = /^[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}$/i;

alert( reg.test('01:32:54:67:89:AB') ); // true

alert( reg.test('0132546789AB') ); // false(缺少冒号)

alert( reg.test('01:32:54:67:89') ); // false(只有 5 个数字,必须是 6 个数字)

alert( reg.test('01:32:54:67:89:ZZ') ) // false(ZZ 不是合法的十六进制)
教程路线图

评论

在评论之前先阅读本内容…
  • 欢迎你在文章下添加补充内容、提出你的问题或回答提出的问题。
  • 使用 <code> 标签插入几行代码,对于多行代码 — 可以使用 <pre>,对于超过十行的代码 — 建议使用沙箱(plnkrJSBincodepen 等)。
  • 如果你无法理解文章中的内容 — 请详细说明。