Мне нужно выражение регулярного выражения, чтобы найти любые слова, отформатированные в CamelCase. Примеры включают в себя:

  • CamelCase.
  • Trunk_Note.
  • Мед-Dr.Zung.
  • _MyToDo-Дом.
  • _MyToDo-Vacation_Cancun
  • iOS_GReader

Ключевые моменты:

  • Первый символ может быть любым символом, допустимым в имени файла ОС Windows.
  • Любой символ может быть любым символом, допустимым в имени файла ОС Windows, включая . ,
  • Слово будет ограничено предыдущим (пробел), ( или [ и сопровождается (пробел), ) или ] .

Зачем? Я использую приложение для iOS под названием Trunk Notes для ведения подробных заметок по всем аспектам моей жизни (более 1000 тем, охватывающих более 10 лет работы, семьи и личного контента). Trunk Notes использует Markdown для форматирования контента, но имеет определенную проблему с моими словами CamelCase. При размещении внутри метки или заголовка ссылки, например, iOS_WriteRoom, движок Markdown заглушает и генерирует битый HTML. Подчеркивания (_) в словах также приводят в замешательство двигатель. Самое простое решение состоит в том, чтобы предшествовать оскорбительному слову с помощью / , например /iOS_WriteRoom.

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

Заранее благодарю за любые предложения.

2 ответа2

3

Это особенно сложно, потому что вы, похоже, не следуете стилю CamelCase, где первая буква всегда пишется с большой буквы, и вы разрешаете использовать несколько последовательных прописных букв. Единственное определение, которое охватило бы все ваши примеры, было бы

Words containing at least two non-consecutive capital letters separated by 
lower case letters.

Это означает, что он также будет захватывать такие шаблоны, как foObaR которые на самом деле не являются CamelCase и могут не соответствовать вашим потребностям.

В любом случае, регулярное выражение ниже соответствует всем вашим примерам *:

 [\(\[ ]([_\-\.a-z]*[A-Z][_\-\.a-zA-Z]+[A-Z]+[_\-\.a-z]*)[\)\] ]
  ----- - -------- - ---  ----------- - --- - -------- -- -----
    |   |     |    |  |        |      |  |  |     |    ||   |> Right boundary: 
    |   |     |    |  |        |      |  |  |     |    ||         ),] or space
    |   |     |    |  |        |      |  |  |     |    ||----> Close capture
    |   |     |    |  |        |      |  |  |     |    |-----> 0 or more
    |   |     |    |  |        |      |  |  |     |----------> Character class:
    |   |     |    |  |        |      |  |  |                   ,-,., or a to z
    |   |     |    |  |        |      |  |  |----------------> 1 or more    
    |   |     |    |  |        |      |  |-------------------> A to Z       
    |   |     |    |  |        |      |----------------------> 1 or more 
    |   |     |    |  |        |-----------------------------> Character class:
    |   |     |    |  |                                        ,-,., a to z 
    |   |     |    |  |                                        or A to Z
    |   |     |    |  |--------------------------------------> Capital letter
    |   |     |    |-----------------------------------------> 0 or more
    |   |     |----------------------------------------------> Character class:
    |   |                                                      ,-,., and a to z
    |   |----------------------------------------------------> Open capture
    |--------------------------------------------------------> Left boundary:
                                                               (,[ or space

* Я думаю. Я сам не использовал notepad++, но на их сайте написано, что они используют Perl-совместимые регулярные выражения. Выше приведен PCRE, который соответствует всем вашим примерам.

1

Крейг -

Я не думаю, что приведенный выше будет работать для всех ваших дел в Notepad++. Если вы еще не нашли ответ, попробуйте этот вариант:

([(\[\s])([a-z0-9_.\-]*[A-Z]+[a-z0-9_.\-]+[A-Z]+[a-z0-9_.\-]*)([)\]\s])

Это также будет соответствовать граничным символам - [] , () или пробелу (\s) - чтобы убедиться, что вы получаете только те WikiWords, которые хотите перехватить. Используйте эту строку в поле Find, а эту в Replace:

\1/\2\3

... и вы должны в конечном итоге (например) (/MyWikiWords) вместо (MyWikiWords) .


Если у вас есть некоторые WikiWords, которые появляются вне контекста скобок или скобок, вы можете попробовать этот поиск:

\b([a-z0-9_.\-]*[A-Z]+[a-z0-9_.\-]+[A-Z]+[a-z0-9_.\-]*)\b

... и это в Replace:

/\1

... которые используют регулярное выражение границы слова (\b).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .