Frage

Dies ist nicht so einfach, wie es scheint. Die meisten von Ihnen denken wahrscheinlich an die Regex /([A-Z])/_$1/ Wie ich im ganzen Internet gefunden habe, aber meine besondere Situation ist etwas komplizierter. Meine Quellzeichenfolge enthält mehr Inhalte, die ich nicht will vor einem Teil konvertiert haben, den ich tun.

Betrachten Sie einen regulären Setter:

public function setUserId()

Natürlich fehlt diese Methode einen Parameter. Vielleicht habe ich viele dieser Methoden. Ich möchte diese Linie in die Linie konvertieren

public function setUserId($user_id)

Das ist eine ziemlich einfache Sache zu berücksichtigen, aber nicht so einfach, wie ich darüber nachdenke. Es ist ähnlich wie bei Andreas_D in Dieser Thread, aber mit der zusätzlichen Herausforderung, den variablen Namen iterativ zu ändern ...

Es wird wahrscheinlich etwas Offensichtliches mit regulären Ausdrücken sein, aber ich bin immer noch ziemlich neu mit ihnen. In jedem Fall kann ich bei meinen Suchanfragen keine anständige Lösung für dieses Problem finden.

EDIT: Natürlich stelle ich fest, dass es keine Hauptstädte in der "öffentlichen Funktion" gibt, die es sicher machen. Diese Suche und Substitution wird jedoch gegen Codeblöcke ausgeführt, und ich möchte sicherstellen, dass die String, die ich geändert habe beginnt mit "öffentlicher Funktion".

War es hilfreich?

Lösung

Suchen Sie zuerst nach Funktionsdefinitionen und fügen Sie dann bei jedem Übereinstimmung einen Parameter basierend auf dem Funktionsnamen ein.

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

Dieses Muster gibt Ihnen Übereinstimmungen mit dem function-Keeyword und der Funktionsname in Gruppe 1 und der von Kamel angelegte Teil des Funktionsnamens in Gruppe 2.

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

Dieses Muster findet den letzten Buchstaben vor einer Oberfall-/Unter-Case-Sequenz, aus der Kamelfall besteht.

Sie haben nicht angegeben, welche Sprache Sie verwenden werden. Hier ist eine Demonstration mit 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)

Die letzte Zeile ("return pattern1.sub(replacer, code)") verwendet einen Rückruf, um den zu ersetzenden Text zu generieren. In den meisten Sprachen sollte es ähnliche Funktionen geben.

Python (vor Version 3.0) verwendet den Modul -Operator ("%") für die Formatierung, ähnlich wie sprintf In zB der Sprache C. C.

Beispiel:

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

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

>>>

Mehr Informationen: .NET - Wie können Sie eine abgrenzte Zeichenfolge in ein Array aufteilen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top