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".

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top