我用Java写了一个词法分析器程序.我使用空格或分号分隔输入字符串,但我真正希望做的是将分号或逗号视为单独的标记,即使它前面没有空格.

现在我有 arr = (str).split("[; ]");

但是当我将输入字符串作为 return a = 25;

字符串的拆分方式如下:[return, a, =, 25] 它不识别;或者将其用作分隔符.我试着为它找一个正则表达式,但我找不到一个有效的.我正在努力避免使用StringTokenizer,但如果它是应该使用且无法避免的东西,请让我知道.我对正则表达式相当陌生,所以我不能弄清楚它.

我try 了正则表达式((?<=;)|(?=;)),但它只与拆分;不考虑空格.

推荐答案

我不会使用复杂、昂贵的后视镜和后视镜,而是只需使用单词边界:

String[] tokens = str.split(" *\\b *");

这将以令牌的形式返回空格,但您可以很容易地删除它们:

tokens = Arrays.stream(tokens)
    .filter(t -> !t.isBlank()).toArray(String[]::new);

您也可以使用splitAsStream一步完成此操作:

String[] tokens = Pattern.compile(" *\\b *").splitAsStream(str)
    .filter(t -> !t.isBlank()).toArray(String[]::new);

Java相关问答推荐

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

Select 按位运算序列

JUnit—如何模拟局部变量对象方法调用

Jlink选项&-strie-ative-Commands";的作用是什么?

流迭代列表<;对象>;上的NoSuchElementException

在bash中将数组作为Java程序的参数传递

RichFaces 3.x-Spring Boot-迁移web.xml

如何创建同一类的另一个对象,该对象位于变量中?

查找剩余的枚举

使用GridBagLayout正确渲染

未找到适用于响应类型[类java.io.InputStream]和内容类型[Text/CSV]的HttpMessageConverter

在处理2个映射表时,没有更多的数据可从套接字读取

如何在Spring Boot中创建可以将值传递给配置的&Enable&Quot;注释?

Java在操作多个属性和锁定锁对象时使用同步和易失性

在Spring Boot JPA for MySQL中为我的所有类创建Bean时出错?

有没有办法知道在合并中执行了什么操作?

具有最大共同前景像素的图像平移优化算法

本机方法(JNI)总是编译的吗?

使用同步方法中的新线程调用同步方法

ANTLR 接受特殊字符,例如 .标识符或表达式中的(点)和 ,(逗号)