用于分裂空间,特殊字符,数字的番石榴分离器

时间:2015-06-16 20:42:48

标签: java split guava

我们可以创建一个以下列方式分裂的番石榴分离器:

abc8 => abc + 8
a-b => a + b
a b => a + b
a,b => a + b
abc8 d => abc + 8 + d

2 个答案:

答案 0 :(得分:1)

你甚至不需要番石榴这种东西。一个简单的String.split就行了。使用以下正则表达式:

(?=\d)|\W

例如:

"abc8".split("(?=\\d)|\\W")

如果您必须使用Guava来解决问题,请注意Guava Splitter是buggy on look-ahead operations。作为解决方法,您可以在String中附加空格字符,并忽略拆分结果中的最后一个匹配项:

Splitter.onPattern("(?=\\d)|\\W").split("abc8 ") // result: [abc, 8, ]

答案 1 :(得分:-1)

我认为这就是你要求的。我不确定是否有更有效的方法。

        String text = "abc-de+f8gsdf12345=";
        boolean lastWasLetter = false;
        boolean lastWasNumber = false;
        for(int i = text.length()-1; i >= 0; i--) {
            if(!Character.isLetterOrDigit(text.charAt(i))) {
                text = text.substring(0, i) + "-" + text.substring(i+1); // Replace special char with "-".
                lastWasLetter = false;
                lastWasNumber = false;
            } else if(Character.isLetter(text.charAt(i))) {
                if(lastWasNumber) {
                    text = text.substring(0, i+1) + "-" + text.substring(i+1); // Add a "-" between a digit and a letter.
                }
                lastWasLetter = true;
                lastWasNumber = false;
            } else { // The char is a digit.
                if(lastWasLetter) {
                    text = text.substring(0, i+1) + "-" + text.substring(i+1); // Add a "-" between a digit and a letter.
                }
                lastWasLetter = false;
                lastWasNumber = true;
            }
        }
        System.out.println("Converted text: " + text);
        System.out.println("Splitted text text: ");
        String[] parts = text.split("-");
        for(String part : parts) {
            System.out.println(part);
        }