有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何匹配一个有一个句子的字符串的令牌,这样它就不会考虑开始时的空间。

       YES      leading spaces        are valid,    problemsetters are         evillllll 

是我的输入,预期输出为:

8

YES

leading

spaces

are

valid

problemsetters

are

evillllll

{-truncated-}

以下是我的节目:

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

public class Solution {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String s = scan.nextLine();
        String array[] = new String[25];
        array = s.split("[^a-zA-Z]+");
        System.out.println(array.length);
        for (String temp: array)
        {
            System.out.println(temp);
        }
        scan.close();
    }
}

我在控制台上收到的输出是:

9

YES

leading

spaces

are

valid

problemsetters

are

evillllll

这里的错误是数组的第一个元素占用了一个空间,这导致令牌的数量等于9而不是8。情况一定不是这样。对于一些不以空格开头的字符串,上面的代码工作得非常好

任何帮助我获得第一个空间的想法都会有帮助


共 (2) 个答案

  1. # 1 楼答案

    从Java 9开始,您可以使用^{}方法,该方法返回一个Stream<String>,它只包含标记,因此忽略所有空格:

    String str = "       YES      leading spaces        are valid,    problemsetters are         evillllll ";
    String[] array = new Scanner(str)
            .useDelimiter("[,\\s]+")
            .tokens()
            .toArray(String[]::new);
    

    此代码生成预期的输出。唯一需要注意的是使用空格和逗号作为分隔符

  2. # 2 楼答案

    在分开之前先把绳子剪短

    修剪

    Returns a copy of the string, with leading and trailing whitespace omitted.

    String[] array = s.trim().split("[^a-zA-Z]+");
    

    问题不在于trim不知何故,正则表达式正在将空字符串拆分为大小为1的字符串[]

    案例1:

        String str=" ";  //blank string
        System.out.println(str.split("[^a-zA-Z]+").length); //0
    

    案例2:

        String str=""; //empty string 
        System.out.println(str.split("[^a-zA-Z]+").length); //1
    

    对空字符串或空白字符串的修剪操作始终返回空字符串

    案例3:

        String str="";  //empty
        String str1 = " ";  //blank
        System.out.println(str.trim().split("[^a-zA-Z]+").length); //1
        System.out.println(str1.trim().split("[^a-zA-Z]+").length); //1
    

    避免这种情况

    trim always input string then check isEmpty() will return true if string is empty (false on blank string) and then do the split function

    System.out.println(" ".isEmpty()+"  "+"".isEmpty()); //false  true