String auslesen

Ich möchte aus einem gegeben String, ab einer bestimmten Stelle eine Zeichenkette von erlaubten Zeichen auslösen. Sobald auf ein anderes Zeichen gestoßen wird soll abgebrochen werden.

z.B.
“Dieses ist ein Text mit !#%&§ Zeichen”

es wird ab der 24. Stelle gelesen. Erlaubte Zeichen sind “!”, “#”, “%”, “&”. Das heist es wird der String “!#%&” ermittelt. Das “§” wird nicht mehr mitgelesen, weil es nicht im erlauben Zeichensatzvorat definiert ist.

  1. Gibt es bereits eine vorgefertige Funktion die dieses erledigen kann?
  2. Wie würdet Ihr die erlaubten Zeichenketten umsetzen? Insbesondere wenn es eine sehr lange Reihenfolge von Zeichenketten ist. Ich denke da z.B. einen Zeichenvorat für Variablen. Variablen dürfen ja aus 0-9, A-Z, a-z und “_” bestehen.

Reguläre Ausdrücke könnten das passende sein?

Pattern pattern = Pattern.compile("^.{24}([!#%&]+)"); 
Matcher matcher = pattern.matcher("Dieses ist ein Text mit !#%&§ Zeichen");
if (matcher.find()) {
    String match = matcher.group(1);
    //match == "!#%&"
}

Oder klassisch

public class ReadPartOfString
{
    public static void main(String[] args)
    {
        String s = "Dieses ist ein Text mit !#%&§ Zeichen";
        String allowed = "!#%&";

        String result = readPart(s, 24, allowed);
        System.out.println(result);
    }

    private static String readPart(String s, int index, String allowed)
    {
        StringBuilder sb = new StringBuilder();
        for (int i = index; i < s.length(); i++)
        {
            char c = s.charAt(i);
            if (!allowed.contains(String.valueOf(c)))
            {
                break;
            }
            sb.append(c);
        }
        return sb.toString();
    }
}

(bei “vielen” allowed chars könnte man eine Datenstruktur mit O(1)-contains-check verwenden, aber das lohnt sich wohl in der Praxis nicht)

Erinnert irgendwie an “String.format()”, also an etwas, wobei in einem String Variablen durch Variablenwerte ersetzt werden sollen. Patterns alleine dürften dazu recht ungeeignet sein und ich würde mich da auch nicht auf “allowed Chars” beschränken, sondern ganz im Sinne von “String.format()” auf Variablen-Definitionen zurückgreifen. Das würde dann etwa eine Mischung aus den beiden bisher genannten Vorschlägen ergeben. Entsprechenden (mehr oder weniger aufwendigen) Code dazu findet man in der Klasse “java.util.Formatter”.