提问人:zzzzz 提问时间:9/24/2020 更新时间:9/24/2020 访问量:160
useDelimiter() 打印空白
useDelimiter() printing empty space
问:
我有一个字符串,.我的目标是使用分隔符来获得所需的输出,如下所示。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
我不完全确定我的正则表达式语法哪里出了问题。
答:
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]+
评论
Splitter.onPattern("[./~]").omitEmptyStrings().split("www.public.website.edu/~JohnSmith/JAVA000")