为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

拉莫斯之舞 2023-04-13 10:46:06
我正在创建一个小程序来将字符串拆分为标记(连续的英文字母字符,然后输出标记的数量以及实际标记。问题是在逗号后跟一个额外的空字符串元素空间。我研究过正则表达式并了解 \W 是任何不是单词字符的东西。String str = sc.nextLine();// creating an array of tokensString 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.预期输出:2HelloWorld实际输出:3HelloWorld注意:这是我的第一个堆栈溢出帖子,如果我做错了什么请告诉我,谢谢
查看完整描述

3 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

Try str.split("\\W+") It 表示 1 个或多个非单词字符

\W 只匹配 1 个字符。所以它在 处中断,然后在空格处再次中断 这就是为什么它会返回一个额外的空字符串。\W+ 将匹配 ', ' 作为一个,所以它只会中断一次,所以你只会取回令牌。(它适用于多个令牌,而不仅仅是两个。所以 'hello, world, again' 会给你 [hello,world,again]。


查看完整回答
反对 回复 2023-04-13
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

尝试这个


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


查看完整回答
反对 回复 2023-04-13
?
潇湘沐

TA贡献1816条经验 获得超6个赞

如果您使用,.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)



查看完整回答
反对 回复 2023-04-13
  • 3 回答
  • 0 关注
  • 211 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信