Saya ingin menulis metode yang mengubah CamelCase menjadi nama yang bisa dibaca manusia.
Inilah test case-nya:
public void testSplitCamelCase() {
assertEquals("lowercase", splitCamelCase("lowercase"));
assertEquals("Class", splitCamelCase("Class"));
assertEquals("My Class", splitCamelCase("MyClass"));
assertEquals("HTML", splitCamelCase("HTML"));
assertEquals("PDF Loader", splitCamelCase("PDFLoader"));
assertEquals("A String", splitCamelCase("AString"));
assertEquals("Simple XML Parser", splitCamelCase("SimpleXMLParser"));
assertEquals("GL 11 Version", splitCamelCase("GL11Version"));
}
PDFLoader
jadinyaPDF Loader
?Jawaban:
Ini berfungsi dengan testcases Anda:
Berikut ini adalah test harness:
Ini menggunakan regex pencocokan panjang nol dengan lookbehind dan lookforward untuk menemukan tempat untuk memasukkan spasi. Pada dasarnya ada 3 pola, dan saya gunakan
String.format
untuk menyatukannya agar lebih mudah dibaca.Tiga pola tersebut adalah:
UC di belakang saya, UC diikuti oleh LC di depan saya
non-UC di belakangku, UC di depanku
Surat di belakang saya, tanpa huruf di depan saya
Referensi
Pertanyaan-pertanyaan Terkait
Menggunakan lookaround pencocokan panjang nol untuk membelah:
sumber
%s
" adalah placeholder untukString.format(String format, args...)
argumen. Anda juga dapat menelepon berdasarkan indeks:String.format("%$1s|%$2s|%$3s", ...
relaceAll
juga saya ingin menambahkan split jika string memiliki ".
" di dalamnya.Anda bisa melakukannya menggunakan
org.apache.commons.lang.StringUtils
sumber
Solusi yang rapi dan lebih pendek:
sumber
assert
, kapitalisasi tidak diinginkan.Jika Anda tidak suka regex "rumit", dan sama sekali tidak peduli tentang efisiensi, maka saya telah menggunakan contoh ini untuk mencapai efek yang sama dalam tiga tahap.
Itu melewati semua kasus uji di atas, termasuk yang memiliki angka.
Seperti yang saya katakan, ini tidak sebagus menggunakan satu ekspresi reguler dalam beberapa contoh lain di sini - tetapi seseorang mungkin menganggapnya berguna.
sumber
Anda dapat menggunakan org.modeshape.common.text.Inflector .
Secara khusus:
Artefak Maven adalah: org.modeshape: modeshape-common: 2.3.0.Final
pada repositori JBoss: https://repository.jboss.org/nexus/content/repositories/releases
Ini file JAR: https://repository.jboss.org/nexus/content/repositories/releases/org/modeshape/modeshape-common/2.3.0.Final/modeshape-common-2.3.0.Final.jar
sumber
Regex berikut dapat digunakan untuk mengidentifikasi huruf kapital di dalam kata-kata:
Ini cocok dengan setiap huruf kapital, yaitu eter setelah huruf atau digit non-kapital atau diikuti oleh huruf kecil dan setiap digit setelah huruf.
Cara memasukkan spasi sebelum mereka di luar kemampuan Java saya =)
Diedit untuk memasukkan case digit dan case Loader PDF.
sumber
L
inPDFLoader
?|
sebagai "atau". Yah ... mungkin itu ... Saya telah melihat yang lebih buruk = /Saya pikir Anda harus beralih pada string dan mendeteksi perubahan dari huruf kecil ke huruf besar, huruf besar ke huruf kecil, alfabet ke numerik, numerik ke alfabet. Pada setiap perubahan Anda mendeteksi memasukkan spasi dengan satu pengecualian: pada perubahan dari huruf besar ke huruf kecil Anda memasukkan spasi satu karakter sebelumnya.
sumber
Ini berfungsi di .NET ... optimalkan sesuai keinginan Anda. Saya menambahkan komentar sehingga Anda dapat memahami apa yang dilakukan masing-masing bagian. (RegEx bisa sulit dimengerti)
sumber
Sebagai catatan, ini adalah versi Scala yang hampir kompatibel:
Setelah dikompilasi, ia dapat digunakan langsung dari Jawa jika scala-library.jar yang sesuai ada di classpath.
(*) gagal untuk input
"GL11Version"
yang dikembalikannya"G L11 Version"
.sumber
Saya mengambil Regex dari polygenelubricants dan mengubahnya menjadi metode ekstensi pada objek:
Ini mengubah segalanya menjadi kalimat yang bisa dibaca. Itu melakukan ToString pada objek yang dilewati. Kemudian ia menggunakan Regex yang diberikan oleh polygenelubricants untuk membagi string. Kemudian ToLowers setiap kata kecuali untuk kata pertama dan akronim apa pun. Kupikir itu mungkin berguna untuk seseorang di luar sana.
sumber
Saya bukan seorang ninja regex, jadi saya akan mengulangi string, menjaga indeks posisi saat ini sedang diperiksa & posisi sebelumnya. Jika posisi saat ini adalah huruf kapital, saya akan memasukkan spasi setelah posisi sebelumnya dan menambah setiap indeks.
sumber
http://code.google.com/p/inflection-js/
Anda bisa menggunakan metode String.underscore (). Humanize () untuk mengambil string CamelCase dan mengubahnya menjadi string yang dapat dibaca manusia.
sumber