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

Regex 不以给定后缀结尾的字符串的正则表达式,regex,Regex,我无法找到一个合适的正则表达式来匹配任何不以某些条件结尾的字符串。例如,我不想匹配任何以a结尾的内容 这与 b ab 1 这不匹配 a ba 我知道正则表达式应该以$结尾来标记结束,但我不知道应该在它前面加什么 编辑:原始问题似乎不是我的案例的合法例子。那么:如何处理多个字符?说出任何不以ab结尾的话 我已经能够通过以下方式解决此问题: 尽管这样做的缺点是,它与一个字符的字符串不匹配。使用非(^)符号: 如果你把^符号放在括号的开头,它意味着“除了括号中的东西以外的所有东西”。$只是结尾的锚

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

这与

b
ab
1
这不匹配

a
ba
我知道正则表达式应该以
$
结尾来标记结束,但我不知道应该在它前面加什么

编辑:原始问题似乎不是我的案例的合法例子。那么:如何处理多个字符?说出任何不以
ab
结尾的话

我已经能够通过以下方式解决此问题:


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

使用
^
)符号:

如果你把
^
符号放在括号的开头,它意味着“除了括号中的东西以外的所有东西”。
$
只是结尾的锚

,只需将它们放在各自的角色集中:

.*[^a][^b]$

上面的正则表达式将匹配不以
a

结尾的字符串,任何与以--
*a$
结尾的字符串匹配的字符串,因此,当匹配正则表达式时,将否定该条件 或者,您也可以执行
*[^a]$
,其中
[^a]
表示任何
不是

的内容,请尝试此操作

/.*[^a]$/

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

您没有提供语言,但如果您的regex Flavor支持,这就是您需要的:

.*(?<!a)$

这将匹配任何不以“ab”结尾的文件。

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

^(?!.*[.]tmp$).*$
使用以下方法进行测试,得出以下结果:


这个问题很老了,但我在这里发布了我的问题,找不到更好的解决方案查找所有USB驱动器,但不列出分区,从而从结果中删除“部分[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

如果您可以使用lookarounds,那么可以接受答案。然而,还有另一种方法可以解决这个问题

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

*[^a]$

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

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

不行。例如,它不接受交流电

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


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

或更广义的版本:

{,n-1}$|.[^firstchar][^secondchar]$
其中n是要禁止的字符串的长度(对于
abc
为3),并且
firstchar
secondchar
。。。第一,第二。。。字符串的第n个字符(对于
abc
,它将是
a
,然后是
b
,然后是
c

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

下面是一个find示例,它将删除所有不是.jpg的文件:


find-正则表达式“{,3}$|.[^.][^j][^p][^g]$”-如果您使用的是
grep
sed
,则语法会略有不同。请注意,顺序
[^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,我在中发现了相同的结果,我认为这是JavaScript语法

坏:

好:

+1,但需要注意的是,这与空字符串不匹配(可能与预期不符),因此其含义相当于“任何不在括号中的字符”。@0A0D:包含空格的字符串不是空字符串。@0A0D实际上,这不值得讨论,那是个好主意fact@Doorknob:这与
ae
cb
不匹配。不,这也不允许使用“acb”。我扩展了我的问题,因为原始示例似乎与我的案例不完全匹配。你能解决这个问题吗?我不知道RegexPAL,但是regex在所有语言中都是不同的,并且lookbehind断言是一个高级功能,不是所有语言都支持。RegexPAL是一个基于javascript的regex测试仪,javascript不支持lookbehind断言,这在regexr(javascript)上是不支持的在JS中缺少长相让我哭泣。如果您正在做服务器端断言,您可能可以在NPM上使用PCRE模块或类似的模块直接使用它们(这是一组绑定,所以我认为您不能在前端使用它)更多类型的先行/后顾断言:这很有趣,您知道为什么会这样做,以及为什么
^.*(![.]tmp$)
没有?您早期的
*
已经匹配了整个字符串,因此剩余的排除不再起作用。就我而言,这起作用了,其他答案没有。谢谢我知道回答有点晚,但对于像我一样对@ukaszZaroda问题感到疑惑的人来说。。可能是因为行尾字符(“\n”和“\r”)
{,2}$|.[^a][^b][^c]$
不匹配
ccc
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
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]$"