Convertir colocador entubado-Pascal a un nombre de variable subrayado separados
-
12-09-2019 - |
Pregunta
Esto no es tan simple como parece. La mayoría de ustedes probablemente pensando en el /([A-Z])/_$1/
expresiones regulares como que he encontrado en todo el Internet, pero mi situación particular es un poco más complicado. Mi cadena de origen contiene más contenido que I No ¿Quieres tener convertidos antes de que una parte I lo .
Considere un regulador normal:
public function setUserId()
Por supuesto, este método es que falta un parámetro. Tal vez tengo muchos de estos métodos. Me gustaría convertir esa línea en
public function setUserId($user_id)
que es una cosa bastante simple a considerar, pero no es tan simple como me planteo es más profundo. Es similar a lo que Andreas_D en este hilo , pero con la reto añadido de tratar de modificar de forma iterativa el nombre de la variable ...
Es, probablemente, va a ser algo obvio el uso de expresiones regulares, pero todavía estoy bastante nuevo con ellos. De cualquier manera, no puedo encontrar una solución a este problema decente en cualquier lugar en las búsquedas.
Edit: por supuesto, soy consciente de que no hay capitales en "función pública" que dejan a lo seguro. Sin embargo, esta búsqueda y sustitución va a correr contra los bloques de código, y quieren asegurarse de que la cadena estoy modificado da comienzo con "función pública".
Solución
En primer lugar la búsqueda de definiciones de funciones, y después de cada partido, insertar un parámetro basado en el nombre de la función.
/\b(function\s+set([A-Z]\w*))\b\s*\(\)/g
Este patrón le dará coincide con la function
-palabra clave y el nombre de la función en el grupo 1, y la parte de camello entubado del nombre de la función en el grupo 2.
/([a-z](?=[A-Z])|[A-Z](?=[A-Z][a-z]))/g
Este patrón se encuentra la última carta antes de una secuencia en mayúsculas / minúsculas que componen camello caso.
No ha especificado el idioma que va a utilizar, por lo que aquí hay una demostración del uso de 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)
La última línea ( "return pattern1.sub(replacer, code)
"), utiliza una devolución de llamada para generar el texto a ser sustituido. Debe haber una funcionalidad similar en la mayoría de idiomas.
Python (antes de la versión 3.0) utiliza el operador de módulo ( "%
") para el formateo, similar a sprintf
en, por ejemplo el lenguaje C.
Ejemplo:
>>> s = """\
... public function setUserName() {
... blaha
... }
... """
>>> print s
public function setUserName() {
blaha
}
>>> print fix_setters(s)
public function setUserName($user_name) {
blaha
}
>>>
Más información: .NET - ¿Cómo se puede dividir un “topes” cadena delimitada en una matriz