猿问

.split() 和 [\\W] 创建一个额外的空字符串?

我正在创建一个小程序来将字符串拆分为标记(连续的英文字母字符,然后输出标记的数量以及实际标记。问题是在逗号后跟一个额外的空字符串元素空间。


我研究过正则表达式并了解 \W 是任何不是单词字符的东西。


String str = sc.nextLine();


// creating an array of tokens

String tokens[] = str.split("[\\W]");


int len = tokens.length;

System.out.println(len);

for (int i = 0; i < len; i++) {

     System.out.println(tokens[i]);

  }

输入:


Hello, World.

预期输出:


2

Hello

World

实际输出:


3

Hello


World

注意:这是我的第一个堆栈溢出帖子,如果我做错了什么请告诉我,谢谢


拉莫斯之舞
浏览 213回答 3
3回答

慕尼黑8549860

Try&nbsp;str.split("\\W+")&nbsp;It 表示 1 个或多个非单词字符\W 只匹配 1 个字符。所以它在 处中断,然后在空格处再次中断 这就是为什么它会返回一个额外的空字符串。\W+ 将匹配 ', ' 作为一个,所以它只会中断一次,所以你只会取回令牌。(它适用于多个令牌,而不仅仅是两个。所以 'hello, world, again' 会给你 [hello,world,again]。

收到一只叮咚

尝试这个Scanner inputter = new Scanner(System.in);System.out.print("Please enter your thoughts : ");final String words = inputter.nextLine();final String[] tokens = words.split("\\W+");Arrays.stream(tokens).forEach(System.out::println);

潇湘沐

如果您使用,.split("\\W")如果出现以下情况,您将得到空项目:非单词字符出现在字符串的开头非字字符连续出现,一个接一个\W匹配 1 个非字字符,打断字符串,然后下一个非字字符再次打断它,产生空字符串。有两条出路。要么删除开头的所有非单词字符,然后拆分为\W+:String tokens[] = str.replaceFirst("^\\W+", "").split("\\W+");或者,将字符块与\w+模式匹配:Pattern p = Pattern.compile("\\w+");Matcher m = p.matcher("   abc=-=123");List<String> tokens = new ArrayList<>();while(m.find()) {    tokens.add(m.group());}System.out.println(tokens)
随时随地看视频慕课网APP

相关分类

Java
我要回答