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

时间:2013-05-06 12:09:51

标签: regex

我无法找到一个正确的正则表达式来匹配任何字符串而不是以某种条件结尾。例如,我不想匹配以a结尾的任何内容。

匹配

b
ab
1

这与

不匹配
a
ba

我知道正则表达式应以$结尾以标记结尾,但我不知道它应该在它之前应该是什么。

编辑:原始问题似乎不是我案例的合法范例。那么:如何处理多个角色?说什么不以ab结尾?

我已经能够使用this thread

来解决这个问题
.*(?:(?!ab).).$

虽然这样做的缺点是,它与一个字符的字符串不匹配。

9 个答案:

答案 0 :(得分:182)

你没有给我们这种语言,但如果你的正则表达式支持look behind assertion,这就是你需要的:

.*(?<!a)$

(?<!a)是一个否定的lookbehind断言,它确保在字符串结束之前(或带有m修饰符的行),没有字符“a”。

here on Regexr

您也可以使用其他字符轻松扩展它,因为这会检查字符串而不是字符类。

.*(?<!ab)$

这将匹配任何不以“ab”,see it on Regexr

结尾的内容

答案 1 :(得分:54)

使用^)符号:

.*[^a]$

如果将^符号放在括号的开头,则表示“除括号中的内容之外的所有内容”。 $只是最后的锚点。

For multiple characters,只需将它们全部放在自己的字符集中:

.*[^a][^b]$

答案 2 :(得分:34)

搜索未以&#34; .tmp&#34;结尾的文件我们使用以下正则表达式:

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

使用Regex Tester进行测试得出以下结果:

enter image description here

答案 3 :(得分:7)

.*[^a]$

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

答案 4 :(得分:3)

试试这个

/.*[^a]$/

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

答案 5 :(得分:0)

任何匹配以--- .*a$结尾的东西所以当你匹配正则表达式时,否定条件 或者您也可以.*[^a]$ [^a]表示not a

的任何内容

答案 6 :(得分:0)

这个问题已经过时了但是我找不到更好的解决方案。 查找所有USB驱动器但未列出分区,从而删除了&#34;部分[0-9]&#34;从结果。我最后做了两次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

答案 7 :(得分:0)

如果您可以使用外观,则接受的答案很好。但是,还有另一种方法可以解决这个问题。

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

.*[^a]$

我们会发现它几乎有效。它不接受空字符串,这可能有点不方便。但是,在处理一个字符时,这是一个小问题。但是,如果我们想要排除整个字符串,例如“abc”,然后:

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

不会这样做。例如,它不会接受交流。

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

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

或更广义的版本:

.{,n-1}$|.*[^firstchar][^secondchar]$ 其中n是您要禁止的字符串的长度(abc为3),firstcharsecondchar,...是字符串的第一个,第二个...第n个字符( abc abc}。

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

以下是将删除所有非.jpg文件的查找示例:

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

答案 8 :(得分:0)

如果您使用的是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语法。

错误:https://regex101.com/r/MJGAmX/2
好:https://regex101.com/r/LzrIBu/2