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

这个比赛

b
ab
1

这个不匹配

a
ba

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

编辑:对于我的案例来说,最初的问题似乎不是一个合理的例子。那么,如何处理多个字符呢?有什么不是ab结尾的吗?

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

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

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


当前回答

你不给我们语言,但如果你的regex风味支持查看断言,这是你需要的:

.*(?<!a)$

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

在Regexr上可以看到

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

.*(?<!ab)$

这能匹配任何不以"ab"结尾的东西,在Regexr上可以看到

其他回答

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

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

用Regex Tester测试得到以下结果:

如果您使用的是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]$"

总之,我在Regex101中发现了同样的结果,我认为它是JavaScript语法。

缺点:https://regex101.com/r/MJGAmX/2 好:https://regex101.com/r/LzrIBu/2

你不给我们语言,但如果你的regex风味支持查看断言,这是你需要的:

.*(?<!a)$

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

在Regexr上可以看到

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

.*(?<!ab)$

这能匹配任何不以"ab"结尾的东西,在Regexr上可以看到

试试这个

/.*[^a]$/

[]表示字符类,^颠倒字符类以匹配除a以外的所有字符。

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