如何使用正则表达式来匹配不在列表中的任何内容

本文关键字:列表 任何内 正则表达式 何使用 | 更新日期: 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]+
    
  • 我假设列表中的项目由单个;字符分隔;

我把它分成三个部分:

  1. 任何开头项,无论是否在列表中:

    (?:[0-9]+;)*
    
  2. 列表中没有的一项必填项:

    (?:(?!(123|456|78)'b)[0-9]+)
    
  3. 任何尾随项,无论是否在列表中:

    (?:;[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]+ 
 $