useDelimiter() 打印空白

useDelimiter() printing empty space

提问人:zzzzz 提问时间:9/24/2020 更新时间:9/24/2020 访问量:160

问:

我有一个字符串,.我的目标是使用分隔符来获得所需的输出,如下所示。String url = "www.public.website.edu/~JohnSmith/JAVA000";

我确实有点明白了,但似乎有一条额外的线打印出来,我不完全确定它来自哪里。

法典:

    public static void main(String[] args) {
        String url = "www.public.website.edu/~JohnSmith/JAVA000";
        Scanner scan = new Scanner(url);
        scan.useDelimiter("[./~]");
        while (scan.hasNext()) {
            System.out.println(scan.next());
        }

实际:

www
public
website
edu

JohnSmith
JAVA000

预期:

www
public
website
edu
JohnSmith
JAVA000

我不完全确定我的正则表达式语法哪里出了问题。

正则表达式 字符串 java.util.scanner

评论

1赞 IronMan 9/24/2020
它似乎正在打印空字符串,因为这是两个分隔符 / 和 ~ 之间的值。番石榴分离器可能更容易使用:Splitter.onPattern("[./~]").omitEmptyStrings().split("www.public.website.edu/~JohnSmith/JAVA000")

答:

2赞 Sweeper 9/24/2020 #1

next将继续读取您提供给扫描程序的字符串,直到找到分隔符,并返回读取的字符串。

让我们看看扫描仪读取后会发生什么。扫描仪的位置现在位于:edu

www.public.website.edu/~JohnSmith/JAVA000
                      ^

它通过转到下一个字符开始阅读。它看到下一个字符也是一个分隔符,因为它与正则表达式匹配,所以它在这里停止。扫描仪读取了哪些非分隔符字符?没有!因此,返回一个空字符串,然后打印该空字符串,这会导致空行出现。~[./~]next

如果您不喜欢空行,可以使用量词指定分隔符是 中的一个或多个字符[./~]+

scan.useDelimiter("[./~]+");

这样,将被视为一个分隔符,而不是 2 个单独的分隔符。/~

评论

0赞 zzzzz 9/24/2020
假设 id 只想提取字母和数字,而将所有其他符号都排除在外,以对抗两个或多个非字母数字字符在一起的效果,我必须使用“+”运算符吗?深刻!谢谢
0赞 Sweeper 9/24/2020
@simonshampoo 如果只需要字母和数字,则可以使用正则表达式作为分隔符。它的意思是“除了字母和数字之外的所有东西,重复一次或多次”。[^a-zA-Z0-9]+