资讯专栏INFORMATION COLUMN

使用正则表达式找出所有不包含某字符串的行

Nosee / 2598人阅读

摘要:好处是用于断言的字符串是一个表达式,通过可以写任意多组字符串。该正则式断言行尾之前的字符串不是。

之前写 Webpack 配置的时候遇到这样一个问题:

</>复制代码

  1. 通过 /.(jpg|png|svg|gif|webp)$/ 判断图片文件,如果符合条件则将其储存至 images 目录下。
    然而这样做会把类似 fontawesome-webfont.svgglyphicons-halflings-regular.svg 这样的字体文件也匹配进去

这是一个强迫症患者所不能接受的。那么问题来了:如何使用正则式匹配一段文字不包含某个字符串呢?

匹配某段文字不以某字符串结尾

比如需要匹配一段文字不以 some_text 结尾

负值字符集合

</>复制代码

  1. /.*[^s][^o][^m][^e][^_][^t][^e][^x][^t]$/

比较容易想到的方式。虽然笨了点,但的确是有效的方法。但这样做只能匹配长度≥9的字符串,而且只能判断不以某一个字符串结尾。

零宽度负预测先行断言

零宽度负预测先行断言 判断断言出现的位置不匹配某个表达式。

</>复制代码

  1. /(?!some_text).{9}$/

该正则式断言最后任意九个字符不是some_text。同样只能匹配长度≥9的字符串。好处是用于断言的字符串是一个表达式,通过 | 可以写任意多组字符串。

零宽度负回顾后发断言

零宽度负预测后发断言 判断断言出现的位置之前不匹配某个表达式。它进入 EcmaScript 标准比较晚,Chrome 62 才提供支持。

</>复制代码

  1. /(?
  2. 该正则式断言行尾之前的字符串不是some_text。这样写就对字符串长度没有限制,是最完美的写法,可惜浏览器支持度较差。

  3. 原生 JS 方法

  4. </>复制代码

    1. str.endsWith("some_text")
  5. 匹配某段文字不以某字符串开头
  6. 比如需要匹配一段文字不以 some_text 开头

  7. 负值字符集合

  8. </>复制代码

    1. /^[^s][^o][^m][^e][^_][^t][^e][^x][^t]/
  9. 好想,但同样只能匹配长度≥9的字符串。

  10. 零宽度负预测先行断言

  11. </>复制代码

    1. /^(!some_text)/
  12. 匹配行首位置后不出现 some_text。没有字符串长度限制,也没有浏览器兼容性问题。

  13. 原生 JS 方法

  14. </>复制代码

    1. str.startsWith("some_text")
  15. 匹配某段文字不包含某字符串
  16. 比如匹配某段文字不包含字符串 some_text

  17. 零宽度负预测先行断言

  18. </>复制代码

    1. /^((?!some_text).)*$/
  19. 正则式断言该段文字的任意位置都不出现 some_text。这样理解:

  20. </>复制代码

    1. /^(?!some_text).(?!some_text).(?!some_text).(?!some_text).(?!some_text).(?!some_text).……$/
  21. 原生 JS 方法

  22. </>复制代码

    1. str.includes("some_text") // ES2016,注意不是 contains
    2. str.indexOf("some_text") >= 0 // 兼容性更好

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93147.html

相关文章

  • nginx

    摘要:文本处理工具文本处理三剑客文本过滤工具基本正则表达式,流编辑器文本编辑工具上的实现为,文本报告生成器,格式化文本正则表达式由一类特殊字符及文本字符所编写的模式类别基本正则表达式扩展正则表达式作用文本搜索工具,根据用户指定的模式过滤条件对目标 Command grep 文本处理工具 Linux文本处理三剑客 grep:文本过滤工具(pattern) grep:基本正则表达式 se...

    andycall 评论0 收藏0

发表评论

0条评论

Nosee

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<