如何检测不带空格的字符串中的关键字?

How to detect keyword in String without spaces?

基本上我想要的结果是根据已知关键字拆分字符串,而不管空格是否分隔关键字。下面是我当前实现的示例,期望 param String line = "sum:=5;":

private static String[] nextLineAsToken(String line) {
    return line.split("\s+(?=(:=|<|>|=))");
}

预期:

String[] {"sum", ":=", "5;"};

实际:

String[] {"sum:=5;"};

我觉得这不可能,但很高兴收到你们的来信。 谢谢

您的主要问题是您编码了 \s+ 而不是 \s* 要求 有空格可以分割,而不是空格是可选的。另一个问题是你的正则表达式只拆分 before operators.

使用这个正则表达式:

\s*(?=(:=|<|>|(?<!:)=))|(?<=(=|<|>))\s*

live demo

或Java:

return line.split("\s*(?=(:=|<|>|(?<!:)=))|(?<=(=|<|>))\s*");

它使用 ahead 来拆分 before 运算符,并使用 behind 来拆分 运算符之后。

已添加

\s* 以消耗术语之间的所有空格。

还要注意 (?<!:) 前瞻中的负面观察,以防止在 := 之间分裂。

这是一个示例代码,您可以使用它来将您的输入分成几组。像常规 space 这样的白色 space 字符将被忽略。它稍后被打印到 for 循环的输出中:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Example {
    public static void main(String[] args) {
        final String regex = "(\w*)\s*(:=)\s*(\d*;)";
        final String string = "sum:=5;";
        
        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);
        
        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }
    }
}

这是输出:

Full match: sum:=5;
Group 1: sum
Group 2: :=
Group 3: 5;