匹配子字符串不属于某一组单词的所有字符串

时间:2018-01-17 19:23:24

标签: regex

我有一堆文件都以'_'结尾,三个数字和'.csv'结尾。 我想删除那些不以'_005.csv','007.csv','008.csv'和'_111.csv'结尾的那些。

我尝试删除所有匹配^.*_(?!005|007|008|111)\.csv$的内容,但它不起作用。我该怎么做?

3 个答案:

答案 0 :(得分:1)

如果你在POSIX系统上,你可以这样做:

ls -1 | grep -vE "_(00[578]|111)\.csv$" | xargs rm

或者您可以使用否定前瞻,正如您在问题中所尝试的那样。要记住的一件事是负向前瞻(?! )内的字符不是匹配的一部分,因此您还必须指定匹配。换句话说,你的正则表达式是这样的:

_(?!(00[578]|111))[0-9]{3}\.csv$

要打破它,首先考虑这个正则表达式:

_[0-9]{3}\.csv$

这将匹配所有以_结尾的文件,三位数字和.csv

现在我们添加负前瞻以排除我们的特定情况。因此,您在(?!(00[578]|111))之后插入_并最终得到上述内容。

同样,在POSIX系统上你可以这样做:

ls -1 | grep -P "_(?!(00[578]|111))[0-9]{3}\.csv$" | xargs rm

答案 1 :(得分:0)

怎么样

^.*_(?:(?!005))(?:(?!007))(?:(?!008))(?:(?!111))\.csv$

答案 2 :(得分:0)

此正则表达式不会捕获文件'_005.csv','007.csv','008.csv'和'_111.csv'。

正则表达式_(?:(00)|(11)|([1-9][02-9]))(?(1)[^578])(?(2)[^1])(?(3)\d)\.csv$

<强>详情:

(?:)非捕获组

(00)|(11)|([1-9][02-9])备选方案

|

[]匹配列表中的单个字符

[^]匹配列表中不存在的单个字符

(?(n))如果Group n

Regex demo