簡體   English   中英

Java String Fix大寫形式的縮寫

[英]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();
}

但據我所知,這種方法存在兩個問題:

  • 如果縮寫有小寫字母(博士)
  • 如果單詞以標點符號開頭或結尾(“ aka”)

我覺得可以使用正則表達式來解決此問題,它可以反復匹配並替換正確的縮寫。 但是,如果沒有,我應該如何解決這個問題?

建議不要使用正則表達式或滾動自己的實現,而建議您使用實用程序庫。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM