繁体   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