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 表示多行搜索