500 Stimmen

Wie extrahiere ich eine Teilzeichenkette mit regex

Ich habe eine Zeichenfolge, die zwei einfache Anführungszeichen enthält, die ' Charakter. Zwischen den einfachen Anführungszeichen stehen die gewünschten Daten.

Wie kann ich einen Regex schreiben, um "die gewünschten Daten" aus dem folgenden Text zu extrahieren?

mydata = "some string with 'the data i want' inside";

723voto

Mark Byers Punkte 761508

Angenommen, Sie wollen den Teil zwischen einfachen Anführungszeichen, verwenden Sie diesen regulären Ausdruck mit einem Matcher :

"'(.*?)'"

Ejemplo:

String mydata = "some string with 'the data i want' inside";
Pattern pattern = Pattern.compile("'(.*?)'");
Matcher matcher = pattern.matcher(mydata);
if (matcher.find())
{
    System.out.println(matcher.group(1));
}

Ergebnis:

the data i want

82voto

Beothorn Punkte 1268

Hierfür brauchen Sie keine Regex.

Fügen Sie apache commons lang zu Ihrem Projekt hinzu ( http://commons.apache.org/proper/commons-lang/ ), dann verwenden:

String dataYouWant = StringUtils.substringBetween(mydata, "'");

21voto

Sean McEligot Punkte 197
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile(".*'([^']*)'.*");
        String mydata = "some string with 'the data i want' inside";

        Matcher matcher = pattern.matcher(mydata);
        if(matcher.matches()) {
            System.out.println(matcher.group(1));
        }

    }
}

20voto

Bohemian Punkte 386825

Hierfür gibt es einen einfachen Einzeiler:

String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");

Dadurch, dass die passende Gruppe optional ist, wird auch dafür gesorgt, dass die Anführungszeichen nicht gefunden werden, da in diesem Fall ein Leerzeichen zurückgegeben wird.

Ver Live-Demo .

19voto

Seit Java 9

Ab dieser Version können Sie eine neue Methode verwenden [Matcher::results](https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Matcher.html#results()) ohne Args, die bequem zurückgeben kann Stream<MatchResult> donde MatchResult stellt das Ergebnis einer Abgleichsoperation dar und bietet die Möglichkeit, abgeglichene Gruppen und mehr zu lesen (diese Klasse ist seit Java 1.5 bekannt).

String string = "Some string with 'the data I want' inside and 'another data I want'.";

Pattern pattern = Pattern.compile("'(.*?)'");
pattern.matcher(string)
       .results()                       // Stream<MatchResult>
       .map(mr -> mr.group(1))          // Stream<String> - the 1st group of each result
       .forEach(System.out::println);   // print them out (or process in other way...)

Der obige Codeschnipsel ergibt:

the data I want
another data I want

Der größte Vorteil liegt in der einfachen Nutzung, wenn ein oder mehrere Ergebnisse vorliegen, im Vergleich zu den verfahrenstechnischen if (matcher.find()) y while (matcher.find()) Kontrollen und Bearbeitung.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X