0

特定のコードにJavaキーワードが含まれているかどうかを検出し、適切なフォーマットのためにそれらをキャプチャできるJavaのアルゴリズムを考え出そうとしています。

キャッチは、文字列リテラル内にない場合にのみキーワードを検出したいということです。

たとえば、声明では

return "I love abstract" + this.artform

returnと をキャプチャしたいのですthisが、 ではありませんabstract

これまで

これまでのところ、すべてのキーワードを検出できる正常な正規表現を作成しました。

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

ただし、一致がリテラル内にある場合を知る機能と統合する必要があるため、複雑になります。

4

3 に答える 3

1

おっしゃったように副次的な部分を統合するのは難しいでしょう。最初の部分では、正規表現手法を引き続き使用してください。java.util.regex.Pattern および java.util.regex.Matcher を使用すると、find() メソッドを (各キーワードに対して) 使用して一致するかどうかを判断できます。true の場合、start() メソッドを呼び出して、最後に find メソッドを呼び出したときのキーワードの位置を特定できます。(これらのメソッドを組み合わせて使用​​します)。

注意が必要な部分は、実際には String クラスを使用して、'"' 二重引用符文字のすべてのインスタンスを特定し、それらの文字位置を取得することです。次に、キーワード位置の開始位置が最初の二重引用符と次の二重引用符文字の位置よりも小さい. 最初に、1 つの二重引用符がそれぞれの二重引用符ペアの兄弟であることを確認する必要があります. もちろん、キーワード全体がこれらの両方の位置の間にあることを確認したい場合があります. . さらに、そのシナリオが当てはまる場合は、二重引用符が別々の行または継続行にあることに注意する必要があります。

基本的に、正規表現を使用してセカンダリ部分を適用しようとしないでください。それを実装しようと本当に夢中になりたくない限り、私の提案です。

于 2013-05-31T17:58:23.217 に答える
0

JavaCC と関連する Java 文法の検索など、完全な 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 に答える