2009-07-13 6 views
2

これはそう簡単ではありません。あなたのほとんどは、私がインターネット上で見つけたように正規表現/([A-Z])/_$1/を考えている可能性がありますが、私の状況はやや複雑です。私のソース文字列には、の内容が含まれていません。は、の部分の前に変換したいと思っています。です。このメソッドは、パラメータが欠落している、もちろんパスカルケースのセッターをアンダースコアで区切られた変数名に変換します

public function setUserId() 

は、通常のセッターを考えてみましょう。多分私はこれらの方法の多くを持っています。私はその行を

public function setUserId($user_id) 

に変換したいと思いますが、それはもっと簡単なことですが、それほど簡単ではありません。それはthis threadのAndreas_Dと似ていますが、変数名を反復的に変更しようとするという課題が追加されています...

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

編集:もちろん、私はそれを安全なままにする「公共の機能」に首都はないことを認識しています。しかし、この検索&の置換はコードのブロックに対して実行されており、私は変更された文字列がであることを "public function"でで確実に開始したい。

答えて

2

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

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

このパターンが得られます、あなたはfunction -keyword、グループ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 - How can you split a “caps” delimited string into an array?

+0

AWESOME MizardX。 これは私が必要としていたものです。私はまだPythonを知らないが(まだ学習しようと思っている...)、読みやすい、非常に直感的な言語だ。テストケースには非常に適しています。 – JMTyler

関連する問題