データベースの列名 user_id と JSON のキー userId を行き来させる。API を書いていると、どこかで必ず出てくる変換です。ネットでよく紹介される書き方を10言語で用意して、getHTTPResponseCode を get_http_response_code に変えさせました。
正しく変えられたのは、10言語中 Ruby の1言語だけでした。
何をしたか
CODE Polyglot の「よく使う書き方」 で、単語の切れ目の決まりを先に決めました(正解表14件)。
- 小文字か数字のあとの大文字(
user|Id)は切れ目 - 大文字が続いたあと、次が小文字になる大文字(
HTTP|Server)も切れ目
よく見かける書き方は10言語で用意しました。毎朝の検証と同じ Linux の環境で動かしています。
大文字が続くと、ばらけるか、くっつく
よくある書き方は、だいたい次の2つのどちらかです。
re.sub(r"(?<!^)(?=[A-Z])", "_", s).lower() # 大文字の前に必ず _ を入れる
regexp.MustCompile(`([a-z0-9])([A-Z])`).ReplaceAllString(s, "${1}_${2}") // 小文字のあとの大文字だけ
getHTTPResponseCode(c003)の結果です。
| 書き方 | 出力 |
|---|---|
| 決まり | get_http_response_code |
| 大文字の前に必ず _(Python・PHP・C#・Rust・Swift・JS) | get_h_t_t_p_response_code |
| 小文字のあとの大文字だけ(Go・Java・Kotlin) | get_httpresponse_code |
Ruby(Rails の underscore と同じ2本の置き換え) | get_http_response_code(一致) |
HTTPServer(c002)も同じ10言語中9言語が崩れました。userID(c004)は、10言語中6言語が user_i_d にしました。
逆向きでは「先頭だけ大文字」の関数の差が出る
MAX_RETRY_COUNT を maxRetryCount に変える(c009)と、10言語中9言語が崩れました。この向きで通ったのは Java だけです。原因は、先頭だけ大文字にする関数が、残りの文字をどう扱うかの違いです。
| 関数 | RETRY が | 出力の例 |
|---|---|---|
Python の title・Ruby の capitalize | Retry(残りを小文字に) | 最初の部分を小文字にし忘れると MAXRetryCount |
PHP の ucwords、Kotlin の replaceFirstChar | RETRY(残りはそのまま) | mAXRETRYCOUNT |
C# の TextInfo.ToTitleCase | RETRY(全部大文字の単語は略語とみなして残す) | mAXRETRYCOUNT |
「英数字だけ」の確かめ方が、日本語を通す
入力が半角の英数字と _ だけかを \w で確かめると、userなまえ(c013)を通してしまう言語があります。Python・C# の \w、Rust の is_alphanumeric()、Swift の CharacterSet.alphanumerics は、ひらがなも「文字」として扱うからです。チェックを書かなかった言語も含めて、10言語中8言語がこの入力を変換しました。
どう書いたか
切れ目を2種類に分けて、それぞれに _ を入れました。Python ならこうです。
if not re.fullmatch(r"[A-Za-z0-9_]*", s):
print("NG: 半角の英数字と _ だけにしてください")
elif mode == "snake":
s = re.sub(r"(?<=[a-z0-9])(?=[A-Z])", "_", s) # 小文字か数字の次の大文字(userId)
s = re.sub(r"(?<=[A-Z])(?=[A-Z][a-z])", "_", s) # 大文字の続きの最後(HTTP|Server)
print(s.lower())
Go の正規表現には後読み・先読みが無く、Rust には標準の正規表現がありません。そのため、この2言語と Swift は1文字ずつ前後を見る形で書いています。Java は toLowerCase(Locale.ROOT)、C# は ToLowerInvariant() を使いました。動かす場所の言語の設定がトルコ語だと、I が点のない ı になるからです。10言語のコードは、どれも14件すべてで決まりどおりの答えを出しています。
まとめ
HTTPServerのように大文字が続く名前で、よく見かける書き方は崩れる(10言語中9言語)- 「先頭だけ大文字」の関数は、残りの文字を小文字にするかどうかが言語で違う
- 使ってよい文字は
\wではなく[A-Za-z0-9_]と書いて決める
10言語のコードと全14件の結果は CODE Polyglot「スネークケースとキャメルケースを変換する」 にあります。
- 第1回:HTML のエスケープ、標準の関数の答えが言語ごとに違った
- 第2回:「2026-02-30T09:00:00Z」を、4言語の標準のパーサーが3月2日として読んだ
- 第3回:「getHTTPResponseCode」をスネークケースに、よく見かける書き方は10言語中9言語で崩れた(この記事)
- 第4回:アクセスログを空白で区切って集計したら、10言語すべてが壊れた行を数えた
- 第5回:重複を消したら順番が変わった、Swift は「が」を1つにまとめた
- 第6回:İstanbul の slug が5通りに割れた、日本語のタイトルはそのまま URL に入った
Analyzegear


