Regex 带有黑名单的驼峰案例的正则表达式

Regex 带有黑名单的驼峰案例的正则表达式,regex,vb.net,Regex,Vb.net,与我的团队一起,我们使用下面的正则表达式模式来描述适合我们需求的上驼峰情况。非常简单的一个——我们可以在互联网上找到许多类似的例子 ^[A-Z]+(?:[A-Z]*[A-Za-z0-9]+)*$ 我们希望通过向这个表达式添加黑名单来改进它。我们可以将此黑名单条目分为两类: 不能位于字符串开头的单词(例如“Bool”,因为我们必须使用“Flag”来代替它) 不能在结尾或在字符串中间的单词(例如“标志”、“路径”、“URL”、“计数器”,因为它们是前缀,它们必须在开头) 当然,我们必须使用黑名单而

与我的团队一起,我们使用下面的正则表达式模式来描述适合我们需求的上驼峰情况。非常简单的一个——我们可以在互联网上找到许多类似的例子

^[A-Z]+(?:[A-Z]*[A-Za-z0-9]+)*$
我们希望通过向这个表达式添加黑名单来改进它。我们可以将此黑名单条目分为两类:

  • 不能位于字符串开头的单词(例如“Bool”,因为我们必须使用“Flag”来代替它)
  • 不能在结尾或在字符串中间的单词(例如“标志”、“路径”、“URL”、“计数器”,因为它们是前缀,它们必须在开头)
  • 当然,我们必须使用黑名单而不是白名单,因为可以禁止的单词比允许的要少得多,而且并非所有字符串都必须以前缀开头)

    如果有人能帮助我将这个黑名单应用到我们现有的正则表达式模式中,我将不胜感激

    问候,, 托梅克

    @编辑: 我认为我没有正确解释我的黑名单想法。我的意思是,黑名单中提到的那些表达式不应该匹配——它们应该被自动排除

    @编辑1: 待匹配案例(正确)

    不匹配的情况(不正确):

    • BoolDataExist
      (黑名单1为真)
    • InputFilePath
      (黑名单2为真)
    • LoggingUrlPage
      (黑名单2为真)
    • otherCamelCase
      (因为它是较低的camelcase)
    • varValue
      (因为它是小写)
    • intValue
      (因为它是小写)
    • 计数器值
      (因为它是小写)

      • 因此,我将根据我留下的评论进行更深入的回答。对于这个问题,一个一刀切的模式只会很混乱(老实说,工作比它的价值还多)。最好使用当前模式获取一组匹配项,然后在其他模式中运行它们,删除任何匹配项。将作为您的通用黑名单,将任何条目与其中的一个黑名单单词匹配。要添加到黑名单中,只需添加一个
        |
        ,后跟您想要列入黑名单的单词

        要将以特定单词开头的条目列入黑名单


        最后,对于以特定单词结尾的黑名单条目,请尝试以下代码。您可以向前缀和黑名单添加其他值。您可以使用
        Join
        来创建备用模式(例如,您可以使用paramater来接受带有这些值的数组,然后
        将它们连接起来)


        它必须是正则表达式吗?我并不是说它不可能实现(因为它可以),但它将是一个难以维持的巨大混乱。最简单的解决方案是为每个类别创建一个集合,并将您的黑名单单词添加到集合中,然后在集合中迭代,查看该单词是否符合该类别的要求。是的,我们需要正则表达式。验证这些字符串所需的工具强制我们使用常规表达式它似乎更容易与当前模式匹配,然后删除与其他规范冲突的任何匹配。验证这些字符串所需的工具强制我们使用正则表达式-grhh;)在第1点中,您说您必须使用
        Flag
        而不是
        Bool
        ,同时在第2点中,您说字符串中不能包含的单词(例如,Flag…)是什么?
        FlagDataExist
        PathInputFile
        UrlLoggingPage
        OtherCamelCase
        VarValue
        IntValue
        CounterValue
        
        Sub Main(args As String())
            Dim strings =
            {
                "FlagDataExist",  'True
                "PathInputFile",  'True
                "UrlLoggingPage", 'True
                "OtherCamelCase", 'True
                "VarValue",       'True
                "IntValue",       'True
                "CounterValue",   'True
                "BoolDataExist",  'False
                "InputFilePath",  'False
                "LoggingUrlPage", 'False
                "otherCamelCase", 'False
                "varValue",       'False
                "intValue",       'False
                "counterValue"    'False
            }
        
            Dim prefixes = String.Join("|", {"Flag", "Path", "Url", "Counter"})
            Dim blackList = String.Join("|", {"Bool"})
            For Each s In strings
                Dim m = Regex.Match(s, $"^(?!({blackList}))(?![A-Za-z]+({prefixes}))(?=[A-Z])")
                Console.WriteLine($"'{s}' -> {m.Success}")
            Next
        End Sub
        
        ' Output:
        '   'FlagDataExist'  -> True
        '   'PathInputFile'  -> True
        '   'UrlLoggingPage' -> True
        '   'OtherCamelCase' -> True
        '   'VarValue'       -> True
        '   'IntValue'       -> True
        '   'CounterValue'   -> True
        '   'BoolDataExist'  -> False
        '   'InputFilePath'  -> False
        '   'LoggingUrlPage' -> False
        '   'otherCamelCase' -> False
        '   'varValue'       -> False
        '   'intValue'       -> False
        '   'counterValue'   -> False