Java字符串修复缩写中的大写

时间:2015-10-08 00:16:10

标签: java regex

我需要一种方法来修复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();
}

但据我所知,这种方法存在一些问题:

  • 如果缩写具有小写字母(Dr.)
  • 如果单词以标点符号开头或结尾(" a.k.a。")

我感觉这可以用正则表达式解决,迭代匹配并替换正确的缩写。但如果没有,我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

我建议您使用实用程序库,而不是使用正则表达式或滚动自己的实现。 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

答案 1 :(得分:1)

您不必使用正则表达式,即。你的解决方案看起来很合理(如果要处理大量数据,可能会很慢)。

对于包含小写字母的缩写,例如。博士你可以使用a case insensitive string comparison而不是function scrollTo($elem, offset, delay, $context){ delay = delay || 800; offset = offset || 0; $context = $context || $('html, body'); var a = $context.find('.large'); //need this $context.animate({ scrollTop: $elem.offset().top - a.offset().top }, delay); } 。实际上,只有你自己直接比较字符串才有用。你真的需要一个不区分大小写的toUpperCase。也许:

HashMap

如果缩写以标点符号开头或结尾,请确保集合中的相应键也是如此。

答案 2 :(得分:1)

这就是我的方式......

更新

阅读OP的评论后

打印:

  罗伯特A.K.A. Bob A.K.A.博比博士o.o。

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;
    }
}