【问题标题】:useDelimiter() printing empty spaceuseDelimiter() 打印空白空间
【发布时间】:2021-01-10 06:20:21
【问题描述】:

我有一个字符串,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

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

【问题讨论】:

  • 它似乎在打印空字符串,因为这是两个分隔符 / 和 ~ 之间的值。可能更容易使用 Guava 拆分器:Splitter.onPattern("[./~]").omitEmptyStrings().split("www.public.website.edu/~JohnSmith/JAVA000")

标签: java regex string java.util.scanner


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 假设 id 只想提取字母和数字,而将所有其他符号排除在外,以消除两个或多个非字母数字字符在一起的影响,我必须使用“+”运算符?有见地!非常感谢
  • @simonshampoo 如果只需要字母和数字,可以使用正则表达式 [^a-zA-Z0-9]+ 作为分隔符。它的意思是“除了字母和数字之外的所有东西,重复一次或多次。”
猜你喜欢
  • 1970-01-01
  • 2015-05-18
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 2020-01-27
相关资源
最近更新 更多