Pergunta

Isso não é tão simples quanto parece. A maioria de vocês provavelmente está pensando no regex /([A-Z])/_$1/ Como eu encontrei em toda a Internet, mas minha situação em particular é um pouco mais complicada. Minha sequência de origem contém mais conteúdo que eu não quero ter convertido antes de uma parte que eu Faz.

Considere um setter regular:

public function setUserId()

Obviamente, esse método está faltando um parâmetro. Talvez eu tenha muitos desses métodos. Eu gostaria de converter essa linha em

public function setUserId($user_id)

O que é uma coisa bastante simples de se considerar, mas não tão simples quanto eu pondero mais profundamente. É semelhante ao que Andreas_D este tópico, mas com o desafio adicional de tentar modificar iterativamente o nome da variável ...

Provavelmente será algo óbvio usando expressões regulares, mas ainda sou muito novo com elas. De qualquer forma, não consigo encontrar uma solução decente para esse problema em qualquer lugar das minhas pesquisas.

EDIT: Claro, percebo que não há capitais na "função pública" que o deixam seguro. Mas, essa pesquisa e substituição estarão sendo executadas contra blocos de código, e eu quero garantir que a string sou modificada começa com "função pública".

Foi útil?

Solução

Primeiro, pesquise as definições de função e, em cada correspondência, insira um parâmetro com base no nome da função.

/\b(function\s+set([A-Z]\w*))\b\s*\(\)/g

Este padrão lhe dará correspondência com o function-Keyword e o nome da função no Grupo 1 e a parte de camelo do nome da função no Grupo 2.

/([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))/g

Esse padrão encontrará a última letra antes de uma sequência de casos superiores/inferior que compõe o caso de camelo.

Você não especificou qual idioma você usará, então aqui está uma demonstração usando Python:

import re

pattern1 = re.compile(r'\b(function\s+set([A-Z]\w*))\b\s*\(\s*\)')
pattern2 = re.compile(r'([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))')

def fix_setters(code):
    def replacer(match):
        var_name = pattern2.sub(r'\1_', match.group(2)).lower()
        return "%s($%s)" % (match.group(1), var_name)
    return pattern1.sub(replacer, code)

A última linha ("return pattern1.sub(replacer, code)"), Usa um retorno de chamada para gerar o texto a ser substituído. Deve haver funcionalidade semelhante na maioria dos idiomas.

O Python (antes da versão 3.0) usa o operador do módulo ("%") para formatação, semelhante a sprintf em por exemplo, o idioma C.

Exemplo:

>>> s = """\
... public function setUserName() {
...   blaha
... }
... """
>>> print s
public function setUserName() {
  blaha
}

>>> print fix_setters(s)
public function setUserName($user_name) {
  blaha
}

>>>

Mais Informações: .NET - Como você pode dividir uma string delimitada de "caps" em uma matriz?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top