1

大文字の文字列をまとめたまま、キャメルケース文字列を個々の単語に分割しようとしています。たとえば、「fooBarABABFooBar」は「foo bar ABAB foo bar」になります。いくつかの要件があります。「ABAB」などの略語は大文字のままにしておく必要がありますが、他の単語の最初の文字は小文字にする必要があります。次の正規表現を使用して、キャメルケースをバラバラにすることができました。

def str = "fooBarABABFooBar"
println str.replaceAll(/(?<=[a-z])(?=[A-Z])/) { ' ' + it }

これで「foo Bar ABABFoo Bar」になります。ここから「foo Bar ABAB Foo Bar」に移動できましたが、目的の出力にはなりませんでした。何か案は?ありがとう!

4

1 に答える 1

1

次の式を試してください。

(?=[A-Z][a-z])|(?<=[a-z])(?=[A-Z])

ご覧のとおり、元のアイデアを使用して少し修正しました。あなたの表現(?<=[a-z])(?=[A-Z])では、小文字の後に大文字が続く位置を一致させようとしたことに気付きました。OK 素晴らしい仕事です。

今、私はこの考えをさらに進めて、他にも重要な位置があることに気付きました。つまり、(?=[A-Z][a-z])言い換えるとFoo、これはおそらくキャメルケースの状況であるため、大文字の後に小文字が続く位置に一致します。

私の式は次の位置に一致します。

foo BarABAB Foo Bar
   ^       ^   ^

1 つの位置が残っていることに注意してください。次の位置を計算する式の番が来ます。

foo Bar ABAB Foo Bar
       ^

したがって、私の表現が失敗すると、あなたの表現は成功し、その逆も同様です。そのため、この 2 つが一致するようになりました。

foo Bar ABAB Foo Bar
   ^   ^    ^   ^
于 2013-09-12T16:11:21.143 に答える