2

これは見かけほど単純ではありません。ほとんどの人は、私がインターネットで見つけたような正規表現を考えていると思いますが/([A-Z])/_$1/、私の特定の状況はもう少し複雑です。ソース文字列には、変換する部分の前に変換したくないコンテンツがさらに含まれています

通常のセッターを考えてみましょう:

public function setUserId()

もちろん、このメソッドにはパラメーターがありません。おそらく私はこれらの方法の多くを持っています。その行をに変換したい

public function setUserId($user_id)

これは考えるのはかなり単純なことですが、深く考えるほど単純ではありません。このスレッドのAndreas_D に似ていますが、変数名を繰り返し変更しようとするという課題が追加されています...

おそらく、正規表現を使用すると明らかなことになるでしょうが、私はまだ正規表現に慣れていません。いずれにせよ、検索のどこにもこの問題に対する適切な解決策が見つかりません。

編集:もちろん、「公共の機能」にはそれを安全に保つ大文字がないことを私は認識しています。ただし、この検索と置換はコードのブロックに対して実行されるため、変更する文字列が「public function」で始まることを確認したいと考えています。

4

1 に答える 1

2

最初に関数定義を検索し、次に一致するたびに、関数名に基づいてパラメーターを挿入します。

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

このパターンはfunction、グループ1の-keywordと関数名、およびグループ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より前)は、たとえば言語C%と同様に、剰余演算子( "")をフォーマットに使用します。sprintf

例:

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

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

>>>

詳細:.NET-「キャップ」で区切られた文字列を配列に分割するにはどうすればよいですか?

于 2009-07-13T12:54:00.163 に答える