2014-01-15 4 views
1

Я пытаюсь создать какую-то систему, которая обнаруживает синтаксис Java и выделяет этот код. Однако мне кажется, что мне трудно найти строку внутри строки.Java: Найти строку в строке

Это то, что я до сих пор:

import java.util.Scanner; 

public class Client { 

    private static String[] javaKeywords = { 
     "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", 
     "default", "do", "double", "else", "enum", "extends", "final", "finnaly", "float", "for", "goto", "if", 
     "implements", "import", "instanceof", "int", "interface", "long", "native", "new", "package", "primitve", 
     "private", "protected", "public", "return", "short", "static", "strictfp", "super", "switch", "synchronized", 
     "this", "throw", "throws", "transient", "try", "void", "volatile", "while" 
    }; 

    private static String[] javaSyntax = { 
     "++", "--", "~", "!", "*", "/", "%", "+", "-", " <<", ">>", ">>>", "<", ">", "<=", ">=", "==", "!=", "&", 
     "^", "|", "&&", "||", "?", ":", "=", "+=", "-=", "/=", "%=", "&=", "^=", "|=", "<<=", ">>=", ">>>=" 
    }; 

    private static Scanner scanner = new Scanner(System.in); 
    private static StringBuilder builder = new StringBuilder(); 

    public static void main(String args[]) { 

     String input; 

     while(!(input = scanner.nextLine()).toLowerCase().contains("exit")) { 

      switch(input.toLowerCase()) { 
       case "print": 
        System.out.println(builder.toString()); 
        continue; 

       case "clear": 
        builder = new StringBuilder(); 
        continue; 
      } 

      builder.append(input + "\n"); 
      codeWrap(builder.toString()); 

     } 

    } 

    private static void codeWrap(String code) { 
     int A4I = 0, position; // A4I = Account for insert length 
     for(String keyword: javaKeywords) { 

      if((position = findInString(code, keyword)) != -1) { 
       builder.insert(position + A4I, "[code]"); 
       A4I += 6; 
       builder.insert(position + keyword.length() + A4I, "[/code]"); 
       A4I += 7; 
      } 

     } 
    } 

    private static int findInString(String string, String keyword) { 
     for(int index = 0, keywordIndex = 0; index < string.length(); index++) { 

      keywordIndex = (string.charAt(index) == keyword.charAt(keywordIndex)) ? ++keywordIndex : 0; 

      if(keywordIndex == keyword.length()) return ((index + 1) - keyword.length()); 

     } 
     return -1; 
    } 

} 

Это работает по большей части, однако, если вы пытаетесь завернуть предложение с двумя ключевыми словами, если ключевое слово Ь перед ключевым словом а в массиве javaKeywords он вернет странный результат.

Например: результат с (реферата), прежде чем б (пока)

abstract while 
print 
[code]abstract[/code] [code]while[/code] 

результат с Ь (пока) перед (реферат)

while abstract 
print 
while [code]a[code]bstra[/code]ct[/code] 
+1

Могу ли я предлагаю использовать Yacc и прогибается, чтобы проверить, если текст кода Java (или по крайней мере напоминает один)? –

+0

Спасибо! Это похоже на то, что я могу использовать. –

ответ

1

Ваша переменная A4I не нужна в этом случае, и вы должны сделать смещения, которые уже рассчитаны. Обратите внимание на следующее:

while abstract 
>loop finds 'abstract' at position 6 
while [code]abstract[/code] 
>A4I is now making all offsets +13 
>loop finds 'while' found at position 0 
>you add that +13 offset to the insert making it drop right in the middle of the abstract 

Вы также переходящая в 2 строки в ваш метод codeWrap, потому что Строки imutatable вы ищете индекс в строке затем использовать его на другой строке. Есть некоторые другие странные вопросы вы будете угрюмым найти в вашей программе, но это должно исправить ваш непосредственный один

private static void codeWrap() { 
    int position; 
    for(String keyword: javaKeywords) { 

     if((position = findInString(builder.toString(), keyword)) != -1) { 
      builder.insert(position, "[code]"); 
      builder.insert(position + keyword.length()+6, "[/code]"); 
     } 

    } 
} 
+0

А, спасибо! Я собирался по кругу, пытаясь понять, что случилось. –

+0

Помните, что если у вас возникли проблемы, просто выложите несколько printlns для отладки вашей программы. Я просто скопировал ваши 2 метода, поместив 2-строчный отладочный код в ваш основной метод: 'builder.append (« abstract while »); codeWrap(); '. Также, если вопрос решен, пожалуйста, отметьте как принятый ответ :) –

+0

Будем благодарны :) –

Смежные вопросы