Преобразовать инсталлятор в Паскале в имя переменной с подчеркиванием - PullRequest
2 голосов
/ 13 июля 2009

Это не так просто, как кажется. Большинство из вас, вероятно, думают о регулярном выражении /([A-Z])/_$1/, которое я нашел по всему Интернету, но моя конкретная ситуация немного сложнее. Моя исходная строка содержит больше контента, который я не хочу преобразовать перед частью, которую я делаю .

Рассмотрим обычный сеттер:

public function setUserId()

Конечно, в этом методе отсутствует параметр. Возможно, у меня много таких методов. Я хотел бы преобразовать эту строку в

public function setUserId($user_id)

это довольно простая вещь для рассмотрения, но не такая простая, как я думаю об этом глубже. Это похоже на то, что Andreas_D в этой теме , но с добавленной проблемой попытки итеративно изменить имя переменной ...

Вероятно, это будет что-то очевидное при использовании регулярных выражений, но я все еще довольно нов с ними. В любом случае, я не могу найти достойного решения этой проблемы нигде в моих поисках.

Редактировать: конечно, я понимаю, что в "публичной функции" нет столиц, которые бы оставляли это в безопасности. Но этот поиск и подстановка будут выполняться с блоками кода, и я хочу убедиться, что измененная строка начинается с "публичной функции".

1 Ответ

2 голосов
/ 13 июля 2009

Сначала найдите определения функций, а затем при каждом совпадении вставьте параметр на основе имени функции.

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

Этот шаблон даст вам совпадения с ключом function и именем функции в группе 1, а также с верблюжьей частью имени функции в группе 2.

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

Этот шаблон найдет последнюю букву перед последовательностью прописных / строчных букв, которые составляют верблюжий регистр.

Вы не указали, какой язык вы будете использовать, поэтому вот демонстрация с использованием 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)

В последней строке ("return pattern1.sub(replacer, code)") используется обратный вызов для генерации замещаемого текста. В большинстве языков должна быть похожая функциональность.

Python (до версии 3.0) использует для форматирования оператор модуля ("%"), аналогично sprintf, например, в. язык C.

Пример:

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

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

>>>

Дополнительная информация: .NET - Как разделить строку с разделителями «caps» на массив?

...