Найти несколько слов в строке и получить индекс

У меня есть большая строка (стиль XML), и я предоставляю текстовое поле для ввода слов для поиска. Все найденные слова должны быть выделены.

У меня проблема в том, что слова могут появляться несколько раз в этой строке, но выделяется только первое или последнее слово. Я обнаружил, что проблема в том, что selectionStart и End всегда одинаковы.

Ты можешь мне помочь?

public static void searchTextToFind(String textToFind) {
    highlighter.removeAllHighlights();
    String CurrentText = textPane.getText();
    StringReader readtext;
    BufferedReader readBuffer;
    int i = 0;
    int matches = 0;
    readtext = new StringReader(CurrentText);
    readBuffer = new BufferedReader(readtext);
    String line;
    try {
        i = CurrentText.indexOf(textToFind);
        int start = 0;
        int end = 0;
        Pattern p = Pattern.compile(textToFind);

        while ((line = readBuffer.readLine()) != null) {
            Matcher m = p.matcher(line);
            // indicate all matches on the line
            while (m.find()) {
                matches++;
                while (i >= 0) {
                    textPane.setSelectionStart(i);
                    textPane.setSelectionEnd(i + textToFind.length());
                    i = CurrentText.indexOf(textToFind, i + 1);
                    start = textPane.getSelectionStart();
                    end = textPane.getSelectionEnd();
                    try {
                        highlighter.addHighlight(start, end,
                                myHighlightPainter);

                    } catch (BadLocationException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    JOptionPane.showMessageDialog(paneXML,
            matches+" matches have been found", "Matched",
            JOptionPane.INFORMATION_MESSAGE);
}

1 ответ

У вас много избыточного кода. Вот короткое и приятное решение с использованием String.indexOf

public static void searchTextToFind(String textToFind) {

    highlighter.removeAllHighlights();
    textToFind = textToFind.toLowerCase(); //STRINGS ARE IMMUTABLE OBJECTS
    String currentText = textPane.getText(); //UPPERCASE LOCALS ARE EVIL
    currentText = currentText.toLowerCase(); //STRINGS ARE IMMUTABLE OBJECTS
    int offset = 0;
    for(int index = currentText.indexOf(textToFind, offset); index >= 0; index = currentText.indexOf(textToFind, offset)){
        int startIndex = currentText.indexOf(textToFind, offset);
        int endIndex = startIndex + textToFind.length() - 1; //this gets you the inclusive endIndex.
        textPane.setSelectionStart(startIndex);
        textPane.setSelectionEnd(endIndex);
        offset = startIndex + 1; //begin the NEXT search at startIndex + 1 so we don't match  the same string over and over again

        System.out.println(startIndex);
        System.out.println(endIndex);
        try {
            highlighter
             .addHighlight(startIndex, endIndex, myHighlightPainter);

        } catch (BadLocationException e) {
             e.printStackTrace();
        }     
    }  
}
Другие вопросы по тегам