如何使用正则表达式来匹配不在列表中的任何内容
本文关键字:列表 任何内 正则表达式 何使用 | 更新日期: 2023-09-27 18:17:05
我有一个不匹配的列表,比如:123,456和78
If the the text is "456", no match.
if the text is "123;456", no match
if the text is "123;78", no match
if the text is "123;34", match
if the text is "56", match
所以只要文本中有任何项不在列表中,那么它就是匹配的。
我能找到的最接近的是:
^(?!(;)?(?:123|456|78)(;)?$).*$
但是"123;456"失败。
那么正确的正则表达式是什么呢?
谢谢
问题似乎是:匹配任何字符串,除非它的形式是"x;y;…;z"与x、y、z等123、456和78中的一个。
我相信这个正则表达式可以做到:
^(..?;)*([^147]|1[^2]|4[^5]|7[^8]|12[^3]|45[^6]|[14]$|12$|45$)
记住:仅仅因为正则表达式可以做一些事情(比如否定正则表达式)并不意味着它们应该被用来做那些事情。在这种情况下,您可能应该在;
上爆炸字符串并检查每个术语,直到找到不匹配。
由于你的问题不是很清楚,我根据你的例子做了几个假设。
-
我假设列表中的每一项都是一个非空的十进制数字序列;特别是匹配以下内容:
[0-9]+
-
我假设列表中的项目由单个
;
字符分隔;
我把它分成三个部分:
-
任何开头项,无论是否在列表中:
(?:[0-9]+;)*
-
列表中没有的一项必填项:
(?:(?!(123|456|78)'b)[0-9]+)
-
任何尾随项,无论是否在列表中:
(?:;[0-9]+)*
将它们组合在一起,我们得到最后的结果:
^(?:[0-9]+;)*(?:(?!(123|456|78)'b)[0-9]+)(?:;[0-9]+)*$
我认为你可以使用文字边界:
'b(?!(?:123|456|78))[^;'n]+
<<h3> RegEx演示/h3> 编辑:我相信我们会追查到底的。
这些更新的正则表达式是可用的最大覆盖范围。
他们使用标准的快速开卷方法。随着需求变得更加清晰,
开始根据需要删除子字符串和/或修饰符,最终保持相同的
总体结构。
祝你好运!
# ======================================================
# Sample contains any chars
# @"^(?s)(?!;*(?:123|456|78)(?:;+(?:123|456|78))*;*$).+$"
^
(?s)
(?!
;*
(?: 123 | 456 | 78 )
(?:
;+
(?: 123 | 456 | 78 )
)*
;*
$
)
.+
$
# ======================================================
# Sample contains semi-colon and digits only
# @"^(?!;*(?:123|456|78)(?:;+(?:123|456|78))*;*$)[;0-9]+$"
^
(?!
;*
(?: 123 | 456 | 78 )
(?:
;+
(?: 123 | 456 | 78 )
)*
;*
$
)
[;0-9]+
$