判断字符串不包含某个串
// 匹配不包含str的串
/(?!str)/
说实话并没有太大用途, 正则是用来判断含有, 而不是判断不含, 这是自动机的原理和机制.
不含的逆命题就是含有, 因此这种问题大都是可以用相反的思路解决的.
全局替换避免贪婪替换
一个实战过程中遇到的问题:
在编写Code组件的时候, 需要高亮单行注释, 将// 这是一行注释
替换为// 这是一行注释
理所当然, 我们认为正则是: /(\/\/.*)
/g, 但是很悲催, 这是一个贪婪的正则, 它遇到
不会停, 一直替换到最后一个
.
严谨一点的话, 正则是/(\/\/.*?)(?:
|$)/g, 考虑到了最后一行是注释而没有
.
用上一个办法可以实现吗, 貌似不可以. 因为最多只能捕获到//.
解决方法: 使用问号.
研究过程代码:
function test(str, regex) {
let match = str.match(regex);
console.log(match);
}
test('//ajava
//bcc
', /(\/\/.*
)/g);
// 匹配是贪婪的: [ '//ajava
//bcc
' ]
test('//ajava
//bcc
', /(\/\/.*?
)/g);
// 匹配不是贪婪的: [ '//ajava
', '//bcc
' ]
回到问题:
let code =
`// 导入vue
import 'vue';
// 主代码
main(); // 编译失败`;
code = code
.replace(/\n/g, '
')
;
console.log('转义过的HTML:\n' + code);
code = code
//.replace(/(\/\/(?:[^]?)+)
/g, '__START__ $1 __END__
')
//.replace(/(\/\/(?:^(?:
)))
/g, '__START__ $1 __END__
')
.replace(/(\/\/.*?)(?:
|$)/g, '__START__ $1 __END__
')
;
console.log('替换过的HTML:\n' + code.replace(/
/g, '\n'));
运行结果:
参考