gpt4 book ai didi

java - 在标记以下字符串 40 println "Hello ",(5+6-4), "-4"时,显示的是单个标记,而不是单独的标记

转载 作者:行者123 更新时间:2023-12-01 09:16:43 25 4
gpt4 key购买 nike

我正在用 Java 为自定义基本语言编写词法分析器。对于以下行40 println "你好",(5+6-4)我希望输出为

40
println
"Hello "
,
(
5
+
6
-
4
)

其他一切都很好,但由于某种原因,我得到 - 和 4 在一起“-4”作为 token 。

使用的正则表达式:

对于数字-?[0-9]+
特殊运算符/字符:[\\[|\\]|/|.|$|*|-|+|=|>|<|#|(|)|%|,|!|||&|||{|}]

不带前导“-”的数字正则表达式在 开头的字符 89 处显示错误?[0-9]+

dangling Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 89 ((?<Reserved>\bPRINTLN\b|\bPRINT\b|\bINTEGER\b|\bINPUT\b|\bEND\b|\bLET\b))|((?<Constants>?[0-9]+))|((?<Special>[\[|\]|/|.|$|*|-|+|=|>|<|#|(|)|%|,|!|||&|||{|}]))|((?<Literals>"[^"]*"))|((?<Identifiers>\w+))

我将正则表达式存储在字符串中,并使用命名捕获分组来识别标记。

最佳答案

(?<Constants>?[0-9]+) - 你的正则表达式中的这部分似乎是问题所在。 ?捕获组名称后面是一个悬空名称。

此外,无需使用|分隔字符类成员。 .

根据您分享的错误,以下内容将是您想要的:

    String regex = "((?<Reserved>\\bPRINTLN\\b|\\bPRINT\\b|\\bINTEGER\\b|\\bINPUT\\b|\\bEND\\b|\\bLET\\b))|((?<Constants>[0-9]+))|((?<Special>[\\[\\]/.$*\\-+=><#()%,!|&{|}]))|((?<Literals>\"[^\"]*\"))|((?<Identifiers>\\w+))";
String s = "40 println \"Hello \",(5+6-4) ";
Matcher matcher = Pattern.compile(regex).matcher(s);
while(matcher.find()) {
System.out.println(matcher.group());
}

我已经删除了悬挂的 ? 上面提到,删除了 | s 用于字符类内部的分隔并转义 -在字符类内(或者您可以将 - 移至字符类的末尾)。

关于java - 在标记以下字符串 40 println "Hello ",(5+6-4), "-4"时,显示的是单个标记,而不是单独的标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40499887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com