Pascal-Casedセッターをアンダースコア分離された変数名に変換します
-
12-09-2019 - |
質問
これは見た目ほど単純ではありません。あなたのほとんどはおそらく正規表現について考えています /([A-Z])/_$1/
私がインターネット全体で見つけたように、しかし私の特定の状況は少し複雑です。私のソース文字列には、より多くのコンテンツが含まれています しないでください 私の一部の前に変換したい 行う.
通常のセッターを検討してください:
public function setUserId()
もちろん、この方法にはパラメーターがありません。おそらく私はこれらの方法の多くを持っています。そのラインをに変換したいのですが
public function setUserId($user_id)
これはかなり簡単なことですが、深く熟考するほど単純ではありません。 Andreas_dが入っているものに似ています このスレッド, 、しかし、変数名を繰り返し変更しようとするという追加の課題があります...
それはおそらく通常の表現を使用して明らかな何かになるでしょうが、私はまだそれらとかなり新しいです。いずれにせよ、検索のどこにでもこの問題に対する適切な解決策が見つかりません。
編集:もちろん、「パブリック機能」には安全なままになっている首都はないことがわかります。しかし、この検索と代替はコードのブロックに対して実行され、私が変更した文字列を確実にしたい 始まります 「パブリック機能」を使用します。
解決
最初に関数定義を検索し、次に各一致で、関数名に基づいてパラメーターを挿入します。
/\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の前)は、Modulus演算子を使用します( "%
")フォーマットの場合 sprintf
たとえば、言語C.
例:
>>> s = """\
... public function setUserName() {
... blaha
... }
... """
>>> print s
public function setUserName() {
blaha
}
>>> print fix_setters(s)
public function setUserName($user_name) {
blaha
}
>>>