字符串不以给定后缀结束的正则表达式

我还没有找到一个合适的正则表达式来匹配任何字符串以某种条件结束。例如,我不想匹配任何以a结尾的内容。

这个比赛

b
ab
1

这个不匹配

a
ba

我知道正则表达式应该以$结尾,尽管我不知道它前面应该是什么。

编辑:对于我的情况,最初的问题似乎不是一个合法的例子。那么,如何处理多个字符呢?说任何不以ab结尾的东西?

我已经能够修复这个问题,使用这个线程:

.*(?:(?!ab).).$

尽管这样做的缺点是,它不匹配一个字符的字符串。

293598 次浏览

使用 (^)符号:

.*[^a]$

如果你把^符号放在括号的开头,它的意思是“除了括号里的东西以外的所有东西”。$只是一个锚到结束。

对于多个字符,把它们都放在自己的字符集中:

.*[^a][^b]$
.*[^a]$

上面的正则表达式将匹配不以a结尾的字符串。

任何匹配以a结尾的东西——.*a$所以当你匹配正则表达式时,对条件求反 或者你也可以使用.*[^a]$,其中[^a]表示任何not a

的值

试试这个

/.*[^a]$/

[]表示字符类,而^反转字符类以匹配除a之外的所有字符。

你不给我们语言,但如果你的正则表达式风味支持看断言背后,这是你需要的:

.*(?<!a)$

(?<!a)是一个反向回溯断言,它确保在字符串(或有m修饰符的行)结束之前,没有字符"a"。

看它在Regexr

你也可以很容易地扩展它与其他字符,因为这检查字符串,并不是一个字符类。

.*(?<!ab)$

这将匹配任何不以"ab", 在Regexr上看到结尾的值

要搜索不以".tmp"结尾的文件,我们使用下面的正则表达式:

^(?!.*[.]tmp$).*$

使用正则表达式测试器进行测试得到以下结果:

enter image description here

这个问题很老了,但我找不到更好的解决方案,我把我的贴在这里。找到所有USB驱动器,但不列出分区,从而从结果中删除“part[0-9]”。我最终做了两个grep,最后一个对结果求反:

ls -1 /dev/disk/by-path/* | grep -P "\-usb\-" | grep -vE "part[0-9]*$"

这在我的系统上的结果是:

pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0

如果我只想要分区,我可以这样做:

ls -1 /dev/disk/by-path/* | grep -P "\-usb\-" | grep -E "part[0-9]*$"

我得到:

pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0-part1
pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0-part2

当我这样做的时候:

readlink -f /dev/disk/by-path/pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0

我得到:

/dev/sdb

如果可以使用查找的话,接受的答案是好的。然而,还有另一种方法来解决这个问题。

如果我们看看这个问题被广泛提出的正则表达式:

.*[^a]$

我们会发现它几乎工作。它不接受空字符串,这可能有点不方便。然而,当只处理一个角色时,这只是一个小问题。然而,如果我们想要排除整个字符串,例如。“abc”,那么:

.*[^a][^b][^c]$

不会做。例如,它不接受ac。

不过,这个问题有一个简单的解决方案。我们可以简单地说:

.{,2}$|.*[^a][^b][^c]$

或者更一般化的说法:

< p > .{,n-1}$|.*[^firstchar][^secondchar]$ 其中n是你想禁止的字符串长度(对于abc,它是3),而firstcharsecondchar,…是第一,第二……字符串的第n个字符(对于abc,它将是a,然后是b,然后是c)

这源于一个简单的观察,即根据定义,比我们不会禁止的文本短的字符串不能包含此文本。所以我们可以接受任何更短的(“ab”不是“abc”),或者任何足够长到我们可以接受但没有结尾的东西。

下面是一个find的例子,它会删除所有不是。jpg的文件:

find . -regex '.{,3}$|.*[^.][^j][^p][^g]$' -delete

如果你使用的是grepsed,语法会有一点不同。注意顺序[^a][^b]方法在这里不起作用:

balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n'
jd8a
8$fb
q(c
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^a]$"
8$fb
q(c
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^b]$"
jd8a
q(c
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^c]$"
jd8a
8$fb
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^a][^b]$"
jd8a
q(c
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^a][^c]$"
jd8a
8$fb
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^a^b]$"
q(c
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^a^c]$"
8$fb
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^b^c]$"
jd8a
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^b^c^a]$"

FWIW,我在Regex101中发现了相同的结果,我认为这是JavaScript语法。

< p >坏:https://regex101.com/r/MJGAmX/2 < br > 好:https://regex101.com/r/LzrIBu/2 < / p >