【发布时间】:2018-12-21 09:02:03
【问题描述】:
scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
谁能解释一下,上面的代码是什么意思。
我对 Java 还是很陌生。
任何帮助将不胜感激。
【问题讨论】:
标签: java regex java.util.scanner
scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
谁能解释一下,上面的代码是什么意思。
我对 Java 还是很陌生。
任何帮助将不胜感激。
【问题讨论】:
标签: java regex java.util.scanner
public Scanner skip(Pattern pattern)
跳过与指定模式匹配的输入,忽略分隔符。如果指定模式的锚定匹配成功,此方法将跳过输入。
如果在当前位置未找到与指定模式的匹配项,则不跳过任何输入并抛出 NoSuchElementException。由于此方法从扫描仪的当前位置开始匹配指定的模式,可以匹配大量输入的模式(例如“.*”)可能会导致扫描仪缓冲大量输入.
因此,这允许您使用正则表达式“移动”扫描仪位置。
跳过行首:
Scanner scan = new Scanner("Hello world");
scan.skip("Hello ");
System.out.println(scan.nextLine());
scan.close();
世界
由于这是使用正则表达式,因此您会一直跳到一行中间的工作:
Scanner scan = new Scanner("Hello world, I am happy to see you");
scan.skip(".*I am ");
System.out.println(scan.nextLine());
scan.close();
很高兴见到你
【讨论】:
这个类的skip() 方法正是这样做的。它将跳过匹配模式的输入。在这种情况下,该模式表示跳过回车符 (\r) 和换行符 (\n),以及一些 unicode 字符。
因此,当读取该行时,它将忽略该模式并仅返回字符串的其余部分。一个更简单的例子是这样的。假设你有一个字符串:
String s = "Hello world, this is my scanner!";
如果你有扫描仪,例如:
Scanner scan = new Scanner(s);
scan.skip(", this is my scanner");
那么当你这样做时:
System.out.println("" + scanner.nextLine());
控制台的输出将是简单的
Hello world!
发生的情况是模式 ", this is my scanner" 被匹配,并从输入中忽略。那么剩下的就是"Hello world!" 字符串了。
【讨论】:
skip 将在方法调用期间完成,而不是在下一次读取操作期间完成。所以你会在skip 期间得到一个NoSuchElementException`,因为你尝试skip 一些没有找到的东西,它以"Hello world" 开头。这个解释是不正确的。