1. ホーム
  2. java

[解決済み] キャメルケースやタイトルケースを分割するためのRegEx (上級)

2023-05-02 04:43:21

質問

私は 華麗な RegEx を使って、camelCase または TitleCase 式の部分を抽出することができます。

 (?<!^)(?=[A-Z])

期待通りに動作しています。

  • 値 -> 値
  • キャメルバリュー -> キャメル/バリュー
  • タイトル値 -> タイトル / 値

例えばJavaで。

String s = "loremIpsum";
words = s.split("(?<!^)(?=[A-Z])");
//words equals words = new String[]{"lorem","Ipsum"}

私の問題は、それがいくつかのケースで動作しないことです。

  • ケース 1: VALUE -> V / A / L / U / E
  • ケース2:eclipseRCPExt -> eclipse / R / C / P / Ext

私の心には、結果はshoudです。

  • ケース 1: VALUE
  • ケース2:eclipse / RCP / Ext

つまり、大文字の文字がn個与えられた場合。

  • n 個の文字の後に小文字の文字が続く場合、そのグループは (n-1 文字) / (n 番目の文字 + 小文字) となります。
  • n文字が末尾にある場合、グループは次のようになります。(n 個の文字) です。

この正規表現を改善する方法について何か考えがありますか?

どのように解決するのですか?

以下の正規表現は、上記のすべての例で動作します。

public static void main(String[] args)
{
    for (String w : "camelValue".split("(?<!(^|[A-Z]))(?=[A-Z])|(?<!^)(?=[A-Z][a-z])")) {
        System.out.println(w);
    }
}   

これは、ネガティブルックバインドが文字列の先頭のマッチを無視するだけでなく、大文字の前に別の大文字がある場合のマッチも無視するように強制することで動作します。これは、"VALUE" のようなケースを処理します。

正規表現の最初の部分は、"RPC" と "Ext" の間の分割に失敗することにより、それ自体で "eclipseRCPExt" に失敗します。これが 2 番目の句の目的です。 (?<!^)(?=[A-Z][a-z] . この句は、文字列の先頭を除いて、小文字が続くすべての大文字の前に分割を許可します。