0

我正在尝试在 Java 中提出一种算法,该算法可以检测给定代码是否包含 Java 关键字并捕获它们以进行正确格式化。

问题是我只想检测不在字符串文字中的关键字。

例如在声明中

return "I love abstract" + this.artform

我想捕获returnand this,但不是abstract

到目前为止

到目前为止,我已经创建了一个可以检测所有关键字的成功正则表达式。

regexp = "(?<=\\W?)(" + keywords.toString() + ")(?=(\\s|\\(|\\.|\\{))"

但是,现在它变得复杂了,因为我需要将它与知道何时匹配在文字中的能力相结合。

4

3 回答 3

1

像您提到的那样整合次要部分将很困难。像你一样继续使用第一部分的正则表达式技术。使用 java.util.regex.Pattern 和 java.util.regex.Matcher,您可以使用 find() 方法(在每个关键字上)确定是否存在匹配项。如果为 true,则可以调用 start() 方法来确定关键字在最后一次调用 find 方法中的位置。(结合使用这些方法)。

棘手的部分实际上非常简单,使用 String 类是确定 '"' 双引号字符的所有实例并获取它们的字符位置。接下来确定关键字位置的开头是否大于第一个双引号并且小于下一个双引号字符的位置。首先,您需要确保一个双引号是其各自双引号对的兄弟。当然,您可能希望确保整个关键字落在这两个位置之间. 此外,如果这种情况适用,您需要注意双引号落在单独的行或续行上。

基本上不要尝试使用正则表达式应用次要部分是我的建议,除非你真的想疯狂地尝试实现它。

于 2013-05-31T17:58:23.217 回答
0

我怀疑你会想要一个完整的 Java 语法和解析器,例如搜索 JavaCC 和相关的 Java 语法,但至少你会想要使用一个标记器,然后为 Java 定义所有各种有效的标记类型. 同样,您可以只使用 JavaCC 的 Java 语法,它已经为您定义了所有标记。请参阅以下链接:

https://javacc.java.net/
https://java.net/projects/javacc/downloads?page=2&path%5B%5D=contrib&path%5B%5D=grammars&theme=java.net

于 2013-05-31T17:02:29.200 回答
0

我解决了我的问题,只是在我的关键字出现之前检查字符串中是否有奇数个引号。如果它很奇怪,那么一个字符串是打开的,并且我所谓的关键字在一个字符串内。如果是偶数,则所有字符串文字都已打开和关闭。

private boolean oddNumberOfQuotes(String prev) {
    int quoteCount = 0;
    for(char ch : prev.toCharArray())
    {
      if(ch == '"') quoteCount++;
    }
    boolean odd = quoteCount % 2 != 0;
    return odd;
}
于 2013-06-13T19:46:20.530 回答