Regex для случая верблюда с черным списком - PullRequest
0 голосов
/ 26 мая 2020

Вместе с моей командой мы используем приведенный ниже шаблон регулярного выражения для описания верхнего регистра верблюда, который соответствует нашим потребностям. Довольно простой - много похожих мы можем найти в inte rnet.

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

Мы хотели бы улучшить его, добавив в это выражение черный список. Мы можем разделить эти записи черного списка на две категории:

  1. Слова, которые не могут быть в начале строки (например, «Bool», потому что вместо этого мы должны использовать «Flag»)
  2. Слова, которые не могут быть в конце или в середине строки (например, «Флаг», «Путь», «URL», «Счетчик», потому что это префиксы, и они должны быть в начале)

Конечно, мы должны использовать подход черного списка вместо белого, потому что слов, которые могут быть запрещены, намного меньше, чем разрешенных, и не все строки должны начинаться с префикса)

Я был бы очень благодарен, если кто-то может помогите мне реализовать этот черный список в нашем существующем шаблоне регулярного выражения.

С уважением, Томек

@ Редактировать: Я думаю, что я неправильно объяснил свою идею черного списка. Я имел в виду, что эти выражения, упомянутые в черном списке, НЕ должны совпадать - они должны быть автоматически исключены.

@ Edit1: Для сопоставления случаев (правильно)

FlagDataExist
PathInputFile
UrlLoggingPage
OtherCamelCase
VarValue
IntValue
CounterValue

НЕ быть совпадающие случаи (неверно):

  • BoolDataExist (черный список №1 верен)
  • InputFilePath (черный список №2 верен)
  • LoggingUrlPage (черный список № 2 верен)
  • otherCamelCase (потому что это нижний регистр верблюда)
  • varValue (потому что это нижний регистр верблюда)
  • intValue (потому что это нижний корпус верблюда)
  • counterValue (потому что это нижний корпус верблюда)

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Попробуйте этот код. Вы можете добавлять другие значения в префиксы и черный список. Вы используете Join для создания альтернативного шаблона (например, вы можете использовать paramater, который принимает массив с этими значениями, а затем вы 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
0 голосов
/ 27 мая 2020

Так что я отвечу более подробно на основе оставленного мной комментария. Универсальный шаблон для этой проблемы был бы просто беспорядком (и, честно говоря, больше работы, чем она того стоит). Лучше использовать ваш текущий шаблон, чтобы получить кучу совпадений, а затем пропустить их через некоторые другие шаблоны, удаляя все, что им соответствует. Этот шаблон будет работать как ваш общий черный список, сопоставляя любую запись с одним из слов из черного списка. Чтобы добавить в черный список, просто добавьте |, за которым следует слово, которое вы хотите внести в черный список.

Для записей в черный список, начинающихся с определенного c слова, шаблон очень похож.

И, наконец, для записей в черный список, которые заканчиваются определенным c словом, это должно помочь

...