Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java字符串修复缩写中的大小写_Java_Regex - Fatal编程技术网

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

Java字符串修复缩写中的大小写,java,regex,Java,Regex,我需要一种方法来修复字符串中缩写的大小写。假设所有缩写词的间距正确 比如说, "Robert a.k.a. Bob A.k.A. dr. Bobby" 变成: "Robert A.K.A. Bob A.K.A. Dr. Bobby" 正确大写的缩写将提前被知道,并存储在某种集合中 我在想这样的算法: private String fix(String s) { StringBuilder builder = new StringBuilder(); for (String w

我需要一种方法来修复字符串中缩写的大小写。假设所有缩写词的间距正确

比如说,

"Robert a.k.a. Bob A.k.A. dr. Bobby"
变成:

"Robert A.K.A. Bob A.K.A. Dr. Bobby"
正确大写的缩写将提前被知道,并存储在某种集合中

我在想这样的算法:

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。 如果单词以标点符号开头或结尾,也可以。
我有一种感觉,这可以用正则表达式解决,迭代匹配并替换正确的缩写。但是如果没有,我应该如何处理这个问题呢?

您不必使用regex,也就是说,您的解决方案看起来是合理的,尽管如果您有大量数据要处理,它可能会很慢

对于包含小写字母的缩写,例如Dr.您可以使用而不是大写字母。实际上,只有您自己直接比较字符串时,这才有用。您确实需要一个不区分大小写的HashMap。也许:

Map<String, String> collection = new TreeMap<String, String>(String.CASE_INSENSITIVE_ORDER);

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

我建议您使用实用程序库,而不是使用正则表达式或滚动自己的实现。在Apache Commons中,Lang非常适合这项工作:

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
我就是这样做的

更新

在阅读了OP的评论之后

它打印:

罗伯特A.K.A.鲍勃A.K.A.博比医生o.o


你想把每个单词的第一个字母大写吗?一个单词由一个字符串序列后跟一个句点或一个空格来定义。这是正确的吗?可能的重复我目前有一个列表,列出了我想要更正的所有缩写。所以,如果有像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;
    }
}