我无法找到合适的正则表达式来匹配不以某种条件结尾的任何字符串。例如,我不希望匹配以结尾的任何内容a
。
这个匹配
b
ab
1
这不匹配
a
ba
我知道正则表达式应该$
以标记结束而告终,尽管我不知道该怎么做。
编辑:原始问题似乎不是我的案例的合法例子。那么:如何处理多个字符?说什么不以ab
?
我已经可以使用以下线程解决此问题:
.*(?:(?!ab).).$
尽管这样做的缺点是,它与一个字符的字符串不匹配。
我无法找到合适的正则表达式来匹配不以某种条件结尾的任何字符串。例如,我不希望匹配以结尾的任何内容a
。
这个匹配
b
ab
1
这不匹配
a
ba
我知道正则表达式应该$
以标记结束而告终,尽管我不知道该怎么做。
编辑:原始问题似乎不是我的案例的合法例子。那么:如何处理多个字符?说什么不以ab
?
我已经可以使用以下线程解决此问题:
.*(?:(?!ab).).$
尽管这样做的缺点是,它与一个字符的字符串不匹配。
Answers:
您没有给我们提供语言,但是如果您的正则表达式风味支持不在assert 后面,那么您需要:
.*(?<!a)$
(?<!a)
是否定式后置断言,可确保在字符串(或带m
修饰符的行)结尾之前没有字符“ a”。
看到这里Regexr
您还可以轻松地用其他字符扩展它,因为这会检查字符串并且不是字符类。
.*(?<!ab)$
这将匹配不以“ ab”结尾的任何内容,请在Regexr上查看
这个问题很老,但我找不到更好的解决方案,我在这里发布了我的问题。查找所有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]$
不会的 例如,它将不接受交流电。
但是,有一个简单的解决方案。我们可以简单地说:
.{,2}$|.*[^a][^b][^c]$
或更广义的版本:
.{,n-1}$|.*[^firstchar][^secondchar]$
其中n是你想禁止(为一个字符串的长度abc
是3),并且firstchar
,secondchar
......首先,你的字符串的第二个......第n个字符(abc
这将是a
的话b
,那么c
)。
这是从一个简单的观察结果得出的,即,比我们不允许的文本短的字符串不能包含此文本。因此,我们可以接受任何较短的内容(“ ab”不是“ abc”),也可以接受足够长的内容以供我们接受但不包含结尾。
这是find的示例,该示例将删除所有非.jpg的文件:
find . -regex '.{,3}$|.*[^.][^j][^p][^g]$' -delete
.{,2}$|.*[^a][^b][^c]$
不匹配ccc
如果您使用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,我在Regex101中发现了相同的结果,我认为这是JavaScript语法。
错误:https://regex101.com/r/MJGAmX/2
好:https://regex101.com/r/LzrIBu/2