我想使用手写的降序解析器解析一些文本。我将Scanner
与以下分隔符"\\s*"
一起使用。不幸的是,这个模式匹配一个空字符串的事实似乎使每个hasNextFoo
和nextFoo
不再匹配。
该文件没有说明可能是空的分隔符。
答案 0 :(得分:1)
您对“+”字符有异议吗?
您确定要使用正则表达式,而不只是对空格字符进行if语句测试吗?你说'运行时'。您的数据是在字符串中,还是在流中,或者是什么?
答案 1 :(得分:1)
您可能还会考虑StreamTokenizer。以下是在recursive-descent parser中将其用于单符号预测的示例。
答案 2 :(得分:1)
是的,因为我想将扫描仪用作运行时词法分析器。简而言之,我希望能够询问scanner.next(pattern),它将返回匹配的字符串,或者在不消耗流的情况下返回异常。空间应该被忽略。如果有一个比扫描仪更好的课程,我很乐意使用它。
我想不出任何现成的库类会为你做这件事。扫描仪/词法分析器的正常模型是将消耗任何无效字符序列(即导致异常的字符序列)。因此,我认为您将不得不手动实现自己的扫描仪,注意将预读字符视为未消耗的。您可以使用“推回”阅读器或(如果该模型不方便)通过使用某种标记/重置模型自己显式缓冲字符来执行此操作。如果你所做的只是分成由一个或多个空格分隔的标记,那么推回阅读器的方法应该没问题。
答案 3 :(得分:0)
可以使用lookbehinds / lookaheads来明确定义哪些分隔符可以省略。
例如,此扫描程序使用空格作为分隔符,但在数字和单词之间不需要它们:
new Scanner("1A.23 4 BC-5")
.useDelimiter("\\s+|(?<=\\d)(?=[A-Z])|(?<=[A-Z])(?=[-+.\\d])");
它产生:
1
A
.23
4
BC
-5
正则表达式由三个替代组成:
\s+
个连续的空格是分隔符。(?<=\d)(?=[A-Z])
数字和字母之间的空字符串是分隔符。(?<=[A-Z])(?=[-+.\d])
字母和' - ','+',''之间的空字符串。要么
数字是分隔符。(注意:\w
不能在这里使用,因为它匹配数字。)