You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则表达式匹配仅含一个.csv后缀的字符串?

如何用正则匹配恰好带一个.csv后缀的字符串

嘿,这需求我熟!要精准匹配像/foo/bar.csv这种只有单个.csv后缀的字符串,同时把/foo/bar.csv.csv这种叠了多层后缀的情况排除掉,用下面这个正则就能搞定:

^.*(?<!\.csv)\.csv$

拆解一下逻辑,你一看就懂:

  • ^ 和 $:锚定字符串的开头和结尾,确保我们匹配的是整个字符串,而不是其中的一部分
  • .*:匹配任意长度的任意字符(默认不包含换行,要是需要支持换行就换成[\s\S]*)
  • (?<!\.csv):这是个负向回顾断言,核心作用就是检查:在我们要匹配结尾的.csv之前,紧挨着的内容绝对不是.csv。这样就直接把xxx.csv.csv这种情况挡在外面了
  • \.csv:匹配结尾的.csv后缀(别忘了.在正则里是通配符,必须用\转义才能表示真正的点)

来看看实际效果:

✅ 能匹配的例子:

  • /foo/bar.csv
  • report_2024.csv
  • docs/user.profile.csv
  • 甚至单独的.csv(如果允许这种无前缀的情况)

❌ 会被排除的例子:

  • /foo/bar.csv.csv
  • data.backup.csv.csv
  • file.csv.txt(结尾不是.csv,自然不匹配)

如果你需要更严格的规则——比如连字符串中间出现abc.csvdef这种包含.csv子串的情况也要排除,那可以用这个加强版正则:

^(?!.*\.csv.*\.csv$).+\.csv$

这个正则多了个负向预查(?!.*\.csv.*\.csv$),能确保整个字符串里只会出现一次.csv,而且必须在末尾。

另外,要是你不想匹配单独的.csv,只想匹配前面有内容的字符串,把.*改成.+就行:

^.+?(?<!\.csv)\.csv$

内容的提问来源于stack exchange,提问作者Ramón J Romero y Vigil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:47:41