Я пытаюсь создать какую-то систему, которая обнаруживает синтаксис 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]
Могу ли я предлагаю использовать Yacc и прогибается, чтобы проверить, если текст кода Java (или по крайней мере напоминает один)? –
Спасибо! Это похоже на то, что я могу использовать. –