在Java中使用Scanner.useDelimeter()来隔离表达式中的令牌



我试图从以下输入中隔离单词,括号和=><=>:

(<=>A B) OR (C AND D) AND(A AND C)

到目前为止,我已经来孤立的字(见Scanner#useDelimeter()):

sc.useDelimeter("[^a-zA-Z]");

使用时:

sc.useDelimeter("[\s+a-zA-Z]");

我只得到括号内的输出

我不想要但想要AND )

我该怎么做?执行\s+得到相同的结果。

还有,分隔符与正则表达式有什么不同?我熟悉PHP中的正则表达式。符号是一样的吗?

输出:

(
<=>
A
(and so on)

您需要一个可以为零宽度的分隔正则表达式(因为有相邻的项),因此遍历是唯一的选择。试试这个:

sc.useDelimeter("((?<=[()>])\s*)|(\s*\b\s*)");

这个正则表达式表示"在括号之后或大于或在字边界处,丢弃空格"


还要注意,字符类[\s+a-zA-Z]包括+字符-大多数字符在字符类中失去任何特殊的正则表达式含义。似乎你试图说"一个或多个空格",但这不是你这样做。

[]中,^表示'not',因此第一个正则表达式[^a-zA-Z]表示'给我所有不是的a-z或a-z '

第二个正则表达式[\s+a-zA-Z]表示"给我的所有内容,空格,+,a-z或a-z"。注意,在字符类中,"+"是一个文字加号。

最新更新