使用正则表达式一次迭代一个字符串一个字符?

时间:2016-12-08 02:26:53

标签: java regex

我想创建一个方法,一次遍历任何字符串(一个字长)一个字符,并使用分隔符打印出新行上的每个字符。为此,我阅读了有关正则表达式(this post helped me the most for learning them)的所有内容,以及有关如何编译要在扫描程序中使用的模式的Java文档(herehere)。在了解了所有这些之后,我创建了以下代码:

    public static void stringPrinter(String whole){
      Pattern p = Pattern.compile(".{1}");
      Scanner scan = new Scanner(whole);
      scan.useDelimiter(p);
      for (int i = 0; i < whole.length(); i++){
          System.out.println(scan.next());
      }
    }

然后我用这一行对它进行了测试:

stringPrinter("okay");

现在在我脑海中,这应该如下工作:

  • 它接受一个字符串并将其设置为变量名whole
  • 它编译保存到变量p的模式,该变量由任意一个字符组成。
  • 它创建一个Scanner对象,设置为扫描字符串whole
  • 它将扫描器的分隔符设置为我们定义的模式p(因此它会在找到的每个字符后停止)。
  • 它将运行一个循环,其运行次数与字符串whole中的字符完全相同。
  • 它将多次运行的语句找到一个字符,然后将其输出到控制台。

所以我希望输出&#39; o&#39;&#39;&#39;&#39; a&#39;和&#39; y&#39;每个人都有自己的路线。

但它给出的实际输出是:

. 


 Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at WholeNumber.stringPrinter(WholeNumber.java:37)
    at WholeNumber.main(WholeNumber.java:28)
    .

(除了没有那些句号。顶部只有三个空白行,下面有一个空行。我添加了这些句号,所以这里会显示空格。)

我认为堆栈跟踪与迭代一次额外的时间有关,但没有新的字符。即使我注释掉我的代码的倒数第二行(声明for循环),我仍然得到这个输出:

 .

(只是一个空行)

有人可以帮我弄清楚发生了什么事吗?我真的不确定这个程序有什么问题。感谢任何帮助,所以提前感谢!

P.S。是的,我在发布此问题之前检查了this post。它确认了我的印象.应检查任何字符,{1}之后应确保它正在查找一个字符。

2 个答案:

答案 0 :(得分:1)

  

有人可以帮我弄清楚发生了什么事吗?

不确定。事前注意:分隔模式".{1}"等同于"."(在定义元素出现一次时没有附加值。)

理解代码行为的关键是来自Scanner文档的这些句子:

  

next()hasNext()方法...首先跳过与分隔符匹配的任何输入    模式,然后尝试返回下一个标记。   ...   

根据分隔模式的类型,空标记可能是    回。 ......划界    模式“\\ s”可以返回空标记,因为它只传递一个    一次空间。

因此,由于分隔模式与任何字符匹配,o字符串中的每个字符(k a y whole)都是分隔符,并且中间的三个空标记由next()返回。

要真正将每个字符作为标记,我们可以使用空分隔模式:.compile("")

答案 1 :(得分:-1)

您可以将字符串转换为string.toCharArray()

的字符数组

然后你可以迭代每个字符并打印出来