Найти слова CamelCase / WikiWord с помощью регулярных выражений в Notepad++ (Np++)
Мне нужно выражение регулярного выражения, чтобы найти любые слова, отформатированные в 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 ответа
Это особенно сложно, потому что вы, похоже, не следуете стилю 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, который соответствует всем вашим примерам.
Крейг -
Я не думаю, что приведенный выше будет работать для всех ваших дел в 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
) регулярное выражение