【问题标题】:Regex for camel case with blacklist带有黑名单的骆驼案例的正则表达式
【发布时间】:2020-05-26 20:24:48
【问题描述】:

我们与我的团队一起使用以下正则表达式模式来描述符合我们需求的大写驼峰式大小写。很简单的一个 - 我们可以在互联网上找到许多类似的。

^[A-Z]+(?:[A-Z]*[A-Za-z0-9]+)*$

我们希望通过向此表达式添加黑名单来改进它。我们可以将这个黑名单条目分为两类:

  1. 不能在字符串开头的单词(例如“Bool”,因为我们必须使用“Flag”代替它)
  2. 不能在字符串末尾或中间的单词(例如“Flag”、“Path”、“Url”、“Counter”,因为这些是前缀,它们必须在开头)

当然,我们必须使用黑名单方法而不是白名单,因为可以禁止的单词比允许的要少得多,而且并非所有字符串都必须以前缀开头)

如果有人能帮我将此黑名单实施到我们现有的正则表达式模式中,我将不胜感激。

问候, 托梅克

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

@Edit1: 待匹配案例(正确)

FlagDataExist
PathInputFile
UrlLoggingPage
OtherCamelCase
VarValue
IntValue
CounterValue

不匹配大小写(不正确):

  • BoolDataExist(黑名单#1为真)
  • InputFilePath(黑名单#2为真)
  • LoggingUrlPage(黑名单#2为真)
  • otherCamelCase(因为是小驼峰)
  • varValue(因为是小驼峰)
  • intValue(因为是小驼峰)
  • counterValue(因为是小驼峰)

【问题讨论】:

  • 必须是正则表达式吗?我并不是说它不能完成(因为它可以),但这将是一个难以维护的巨大混乱。最简单的解决方案是为每个类别创建一个集合,并将您列入黑名单的词添加到集合中,然后遍历集合以查看该词是否符合类别的要求。
  • 是的,我们需要正则表达式。我们需要验证这些字符串的工具强制我们使用正则表达式
  • 似乎更容易与您当前的模式匹配,然后删除与其他规范冲突的任何匹配项。 regex101.com/r/nUN6rW/1
  • 我们需要验证这些字符串的工具强制我们使用正则表达式 - grhh ;)
  • 在你的第 1 点你说 Bool 你必须使用 Flag同时 在第 2 点你说 不能在字符串中(例如,Flag...) 什么?

标签: regex vb.net


【解决方案1】:

试试这个代码。您可以将其他值添加到前缀和黑名单。您可以使用 Join 创建替代模式(例如,您可以使用接受具有这些值的数组的参数,然后您 Join 它们)。

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

【讨论】:

    【解决方案2】:

    所以我会根据我留下的评论更深入地回答。对于这个问题,一刀切的模式只会很混乱(老实说,工作量比它的价值多)。你最好使用你当前的模式来获得一堆匹配,然后通过其他模式运行它们,删除任何匹配它们的东西。 This pattern 将用作您的一般黑名单,将任何条目与其中一个列入黑名单的单词进行匹配。要添加到黑名单,只需添加一个|,后跟您要列入黑名单的字词。

    要将以特定单词开头的条目列入黑名单,the pattern is very similar.

    最后,将以特定单词结尾的条目列入黑名单,this should do the trick

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 2023-03-12
      • 2013-03-24
      • 2021-05-06
      • 2017-02-05
      • 2014-09-14
      • 2015-07-07
      相关资源
      最近更新 更多