如何编写正则表达式匹配仅含一个.csv后缀的字符串?
如何用正则匹配恰好带一个
.csv后缀的字符串 嘿,这需求我熟!要精准匹配像/foo/bar.csv这种只有单个.csv后缀的字符串,同时把/foo/bar.csv.csv这种叠了多层后缀的情况排除掉,用下面这个正则就能搞定:
^.*(?<!\.csv)\.csv$
拆解一下逻辑,你一看就懂:
^和$:锚定字符串的开头和结尾,确保我们匹配的是整个字符串,而不是其中的一部分.*:匹配任意长度的任意字符(默认不包含换行,要是需要支持换行就换成[\s\S]*)(?<!\.csv):这是个负向回顾断言,核心作用就是检查:在我们要匹配结尾的.csv之前,紧挨着的内容绝对不是.csv。这样就直接把xxx.csv.csv这种情况挡在外面了\.csv:匹配结尾的.csv后缀(别忘了.在正则里是通配符,必须用\转义才能表示真正的点)
来看看实际效果:
✅ 能匹配的例子:
/foo/bar.csvreport_2024.csvdocs/user.profile.csv- 甚至单独的
.csv(如果允许这种无前缀的情况)
❌ 会被排除的例子:
/foo/bar.csv.csvdata.backup.csv.csvfile.csv.txt(结尾不是.csv,自然不匹配)
如果你需要更严格的规则——比如连字符串中间出现abc.csvdef这种包含.csv子串的情况也要排除,那可以用这个加强版正则:
^(?!.*\.csv.*\.csv$).+\.csv$
这个正则多了个负向预查(?!.*\.csv.*\.csv$),能确保整个字符串里只会出现一次.csv,而且必须在末尾。
另外,要是你不想匹配单独的.csv,只想匹配前面有内容的字符串,把.*改成.+就行:
^.+?(?<!\.csv)\.csv$
内容的提问来源于stack exchange,提问作者Ramón J Romero y Vigil
相关产品推荐
相关产品推荐

