[英]Java String Fix Capitalization in Abbreviations
我需要一種在String
找到的縮寫中固定大小寫的方法。 假定所有縮寫詞的間距正確。
例如,
"Robert a.k.a. Bob A.k.A. dr. Bobby"
變為:
"Robert A.K.A. Bob A.K.A. Dr. Bobby"
正確知道大寫的縮寫將被提前存儲在某種Collection
中。
我在想這樣的算法:
private String fix(String s) {
StringBuilder builder = new StringBuilder();
for (String word : s.split(" ")) {
if (collection.contains(word.toUpperCase()) {
// word = correct abbreviation here
}
builder.append(word);
builder.append(" ");
}
return builder.toString().trim();
}
但據我所知,這種方法存在兩個問題:
我覺得可以使用正則表達式來解決此問題,它可以反復匹配並替換正確的縮寫。 但是,如果沒有,我應該如何解決這個問題?
建議不要使用正則表達式或滾動自己的實現,而建議您使用實用程序庫。 Apache Commons Lang中的WordUtils
非常適合此工作:
String input = "Robert a.k.a. Bob A.k.A. dr. Bobby";
String capitalized = WordUtils.capitalize(input, '.', ' ');
System.out.println(capitalized);
打印出來
Robert A.K.A. Bob A.K.A. Dr. Bobby
您不必使用正則表達式,即。 您的解決方案看起來很合理(盡管如果要處理大量數據,可能會很慢)。
縮寫包含小寫字母,例如。 博士,您可以使用不區分大小寫的字符串比較,而不是toUpperCase
。 實際上,僅當您自己直接比較字符串時,這才有用。 您確實需要不區分大小寫的HashMap
。 也許:
Map<String, String> collection = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);
如果縮寫以標點符號開頭或結尾,請確保集合中的相應鍵也是如此。
這就是我的方法...
更新
在閱讀了OP的評論后
它打印:
Robert AKA Bob AKA鮑比博士The oo
import java.util.ArrayList;
import java.util.List;
public class Fixer {
List<String> collection = new ArrayList<>();
public Fixer() {
collection.add("Dr.");
collection.add("A.K.A.");
collection.add("o.o.");
}
/* app entry point */
public static void main(String[] args) throws InterruptedException {
String testCase = "robert a.k.a. bob A.k.A. dr. bobby the o.o.";
Fixer l = new Fixer();
String result = l.fix(testCase);
System.out.println(result);
}
private String fix(String s) {
StringBuilder builder = new StringBuilder();
for (String word : s.split(" ")) {
String abbr = getAbbr(word);
if (abbr == null) {
builder.append(word.substring(0, 1).toUpperCase());
builder.append(word.substring(1));
} else {
builder.append(abbr);
}
builder.append(" ");
}
return builder.toString().trim();
}
private String getAbbr(String word) {
for (String abbr : collection) {
if (abbr.equalsIgnoreCase(word)) {
return abbr;
}
}
return null;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.