给定一个字符串s,将字符串拆分为标记

时间:2016-07-03 08:32:00

标签: java string

我将一个标记定义为一个或多个连续的英文字母。然后,打印令牌的数量,然后在新行上打印每个令牌。字符串''由英文字母,空格和以下任何字符组成:!,?。_'@ 这就是我正在做的事情。

import java.io.*;
import java.util.*;

public class apples {

     public static void main(String[] args) {
         Scanner scan = new Scanner(System.in);
         String s = scan.nextLine();
         scan.close();

            String[] splitString = (s.split("[\\s!,?._'@]+"));
            System.out.println(splitString.length);
            for (String string : splitString) {
                System.out.println(string);
              }
}
}

当我输入一个以上述任何字符开头的字符串时,我的代码正在对字符进行计数,而在打印时会给出一个空白空间,就像这样。

    @dsd sd.sf 
    4

    dsd
    sd
    sf 

我期待的是这个。

    @dsd sd.sf 
    3
    dsd
    sd
    sf 

请帮助!!

2 个答案:

答案 0 :(得分:2)

第一个分隔符之前没有文本,因此您获得一个空字符串。我建议你忽略第一个空字符串。您也可以在开始时添加分隔符,以便知道有一个可以随时忽略的分隔符。例如

String[] split = ("@"+s).split("\\W+"); 
int words = split.length - 1;

或者你可以截断前导非字母

String[] split = s.replaceAll("^\\W+", "").split("\\W+");

答案 1 :(得分:0)

import java.io.*;
import java.util.*;

public class Solution {

    public static void main(String[] args) 
    {
        Scanner scan = new Scanner(System.in);

        if (!scan.hasNext())
        {
            System.out.println(0);
        }
        else
        {
            String s = scan.nextLine();
            scan.close();
            s=s.replaceAll("^\\W+", "");  
            String[] words = s.split("[\\s',!?._@]+");

            int len=words.length;
            System.out.println(len);

                for(String i:words)
                {
                    System.out.println(i);
                }

        }
    }
}