Encontre palavras CamelCase / WikiWord usando regex no Notepad ++ (Np ++)

0

Eu preciso de uma instrução regex para encontrar as palavras formatadas no CamelCase. Exemplos incluem:

  • CamelCase.
  • Trunk_Note.
  • Med-Dr.Zung.
  • _MyToDo-Housework.
  • _MyToDo-Vacation_Cancun
  • iOS_GReader

Pontos principais:

  • O primeiro caractere pode ser qualquer caractere válido em um nome de arquivo do sistema operacional Windows.
  • Qualquer caractere pode ser qualquer caractere válido em um nome de arquivo do SO Windows, incluindo . .
  • A palavra será delimitada por (espaço), ( ou [ precedentes e seguida por (espaço), ) ou ] .

Por quê? Eu uso um aplicativo para iOS chamado Trunk Notes para manter notas extensas sobre todos os aspectos da minha vida (mais de 1000 tópicos cobrindo mais de 10 anos de trabalho, família e conteúdo pessoal). O Trunk Notes usa o Markdown para formatação de conteúdo, mas tem um problema específico com as palavras do CamelCase. Quando colocado dentro de um rótulo de link ou título, por exemplo iOS_WriteRoom, o mecanismo de Markdown engasga e gera HTML quebrado. Sublinhados ( _ ) nas palavras também confundem o mecanismo. A solução simplista é preceder a palavra ofensiva com / , por ex. / iOS_WriteRoom.

Eu comecei a fazer edições manuais, mas sei que o regex deveria funcionar para mim. Assim, minha solução de regex procurará o padrão correspondente e adicionará um / se um / ainda não tiver sido prefixado.

Agradeço antecipadamente por qualquer sugestão.

    
por Craig in Calgary 26.06.2013 / 20:49

2 respostas

3

Isso é particularmente difícil porque você não parece estar seguindo um estilo CamelCase em que a primeira letra é sempre maiúscula e você está permitindo várias maiúsculas consecutivas. A única definição que capturaria todos os seus exemplos seria

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

Isso significa que ele também captura padrões como foObaR que não são realmente CamelCase e podem não ser o que você precisa.

De qualquer forma, a expressão regular abaixo corresponde a todos os seus exemplos *:

 [\(\[ ]([_\-\.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

* Eu acho. Eu não usei o notepad ++, mas o site diz que eles usam Expressões regulares compatíveis com Perl . O acima é um PCRE que corresponde a todos os seus exemplos.

    
por 26.06.2013 / 21:36
1

Craig -

Não acho que o acima funcione para todos os seus casos no Notepad ++. Se você ainda não encontrou uma resposta, tente esta variação:

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

Isso também corresponderá aos caracteres de limite - [] , () ou espaço ( \s ) - para garantir que você receba apenas os WikiWords que deseja capturar. Use essa string no campo Find e esta em Substituir:

/

... e você deve acabar com (por exemplo) (/MyWikiWords) no lugar de (MyWikiWords) .

Se você tiver alguns WikiWords que aparecem fora do contexto de colchetes ou parênteses, tente esta Pesquisa:

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

... e isso em Substituir:

/

... que usam o limite da palavra ( \b ) regex.

    
por 07.08.2013 / 21:28