之前写 Webpack 设置的时刻碰到如许一个题目:
经由过程
/\.(jpg|png|svg|gif|webp)$/
推断图片文件,假如相符前提则将其贮存至
images
目录下。但是如许做会把相似
fontawesome-webfont.svg
和
glyphicons-halflings-regular.svg
如许的字体文件也婚配进去
这是一个强迫症患者所不能接收的。那末题目来了:怎样运用正则式婚配一段笔墨不包括某个字符串呢?
婚配某段笔墨不以某字符串末端
比方须要婚配一段笔墨不以 some_text
末端
- 负值字符鸠合
/.*[^s][^o][^m][^e][^_][^t][^e][^x][^t]$/
比较轻易想到的体式格局。虽然笨了点,但的确是有用的要领。但如许做只能婚配长度≥9的字符串,而且只能推断不以某一个字符串末端。
- 零宽度负展望先行断言
零宽度负展望先行断言
推断断言涌现的位置不婚配某个表达式。
/(?!some_text).{9}$/
该正则式断言末了恣意九个字符不是some_text
。一样只能婚配长度≥9的字符串。优点是用于断言的字符串是一个表达式,经由过程 |
能够写恣意多组字符串。
- 零宽度负回忆后发断言
零宽度负展望后发断言
推断断言涌现的位置之前不婚配某个表达式。它进入 EcmaScript 规范比较晚,Chrome 62 才供应支撑。
/(?<!some_text)$/
该正则式断言行尾之前的字符串不是some_text
。如许写就对字符串长度没有限定,是最圆满的写法,惋惜浏览器支撑度较差。
- 原生 JS 要领
str.endsWith('some_text')
婚配某段笔墨不以某字符串开首
比方须要婚配一段笔墨不以 some_text
开首
- 负值字符鸠合
/^[^s][^o][^m][^e][^_][^t][^e][^x][^t]/
好想,但一样只能婚配长度≥9的字符串。
- 零宽度负展望先行断言
/^(!some_text)/
婚配行首位置后不涌现 some_text
。没有字符串长度限定,也没有浏览器兼容性题目。
- 原生 JS 要领
str.startsWith('some_text')
婚配某段笔墨不包括某字符串
比方婚配某段笔墨不包括字符串 some_text
- 零宽度负展望先行断言
/^((?!some_text).)*$/
正则式断言该段笔墨的恣意位置都不涌现 some_text
。如许明白:
/^(?!some_text).(?!some_text).(?!some_text).(?!some_text).(?!some_text).(?!some_text).……$/
- 原生 JS 要领
str.includes('some_text') // ES2016,注重不是 contains
str.indexOf('some_text') >= 0 // 兼容性更好