6. 正则表达式必知必会-位置匹配

6.1 边界

const str = 'The cat scattered his food all over the room.';
const reg = /cat/g; // 只想找出 cat
let match;
while ((match = reg.exec(str))) {
  console.log(`${match[0]}, index: ${match.index}`);
}
// cat, index: 4
// cat, index: 9 <-- 匹配出了 scattered 中的 cat

6.2 单词边界

1、限定符 \b 指定单词边界 (boundary)

const str = 'The cat scattered his food all over the room.';
const reg = /\bcat\b/g;
let match;
while ((match = reg.exec(str))) {
  console.log(`${match[0]}, index: ${match.index}`);
}
// cat, index: 4

不匹配一个位置,与 \b 相反 -- \B

const str = 'Pls enter the nine-digit id as it appears on you color - coded pass-key.';
const reg = /\B-\B/g;
let match;
while ((match = reg.exec(str))) {
  console.log(`${match[0]}, index: ${match.index}`);
}
// -, index: 55

2、\<\>

支持的引擎不多见。

6.3 字符串边界

定义字符串开头:^

定义字符串结尾:$

检测是不是 html 文档:

const str = '\
<html>\
<head></head>\
<body>This is a html document.</body>\
</html>';
const reg = /<html>/;
console.log(reg.test(str)); // true

似乎是对的,再看下面的例子:

const str = 'Hello hello\
<html>\
<head></head>\
<body>This is not a html document.</body>\
</html>';  // <-- 注意:<html> 前面有 Hello hello,不是一个正确的 html 文档
const reg = /<html>/;
console.log(reg.test(str)); // true <-- 返回true,应该是false

使用 ^ 定义开头。

const str = 'Hello hello\
<html>\
<head></head>\
<body>This is not a html document.</body>\
</html>';
const reg = /^<html>/; // <-- 使用 ^,表示以 < 开头
console.log(reg.test(str)); // false <-- 返回 false

分行匹配模式

(?m) 记号是一个能改变其他元字符行为的元字符序列。

(?m) 可以使行分隔符当作字符串分隔符。

在分行匹配模式下,^ 可以匹配字符串的开头,还可以匹配行分隔符后面的开始位置。

将正则表达式里的注释内容找出来。

<script>
function doSpellCheck(form, field) {}
  // make sure not empty 
  if (field.value === '') {
    return false; 
  }
  // init 
  const windowName = '';
  // done
  return false;
}
</script>
const str = `\n
<script>\n
function doSpellCheck(form, field) {}\n
  // make sure not empty \n
  if (field.value === '') {\n
    return false; \n
  }\n
  // init \n
  const windowName = '';\n
  // done\n
  return false;\n
}\n
</script>\n
`;
console.log(str);
const reg = /^\s*\/\/.*$/gm; // <-- 注 JS 不支持 (?m),JS 中用 m 表示(多行搜索)
let match;
while ((match = reg.exec(str))) {
  console.log(match[0]);
}
// // make sure not empty
// // init
// // done

注: JS 不支持 (?m),JS 中用 m 表示多行搜索

Last Updated: 7/31/2019, 3:30:20 PM