it-swarm.com.de

Wie extrahiere ich einen Teilstring mit Regex?

Ich habe eine Zeichenfolge, die zwei einfache Anführungszeichen enthält, das '-Zeichen. Zwischen den einfachen Anführungszeichen stehen die Daten, die ich möchte.

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";
312
asdasd

Angenommen, Sie möchten den Teil zwischen Anführungszeichen setzen, verwenden Sie diesen regulären Ausdruck mit einer Matcher

"'(.*?)'"

Beispiel:

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:

 die Daten, die ich will 
476
Mark Byers

Sie brauchen dafür keine Regex.

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

String dataYouWant = StringUtils.substringBetween(mydata, "'");
58
Beothorn
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));
        }

    }
}
10
Sean McEligot

Weil Sie auch Scala angekreuzt haben, eine Lösung ohne Regex, die problemlos mit mehreren zitierten Strings umgehen kann:

val text = "some string with 'the data i want' inside 'and even more data'"
text.split("'").zipWithIndex.filter(_._2 % 2 != 0).map(_._1)

res: Array[Java.lang.String] = Array(the data i want, and even more data)
9
Debilski

Dafür gibt es einen einfachen Einzeiler:

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

Wenn Sie die übereinstimmende Gruppe optional machen, werden auch Anführungszeichen berücksichtigt, die nicht gefunden werden, indem Sie in diesem Fall ein Leerzeichen zurückgeben.

Siehe Live Demo .

7
Bohemian
String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1");
5
ZehnVon12

wie in Javascript:

mydata.match(/'([^']+)'/)[1]

der eigentliche Regex ist: /'([^']+)'/

wenn Sie den nicht-gierigen Modifikator (wie in einem anderen Beitrag) verwenden, ist dies folgendermaßen

mydata.match(/'(.*?)'/)[1]

es ist sauberer.

3
Mihai Toader

In Scala,

val ticks = "'([^']*)'".r

ticks findFirstIn mydata match {
    case Some(ticks(inside)) => println(inside)
    case _ => println("nothing")
}

for (ticks(inside) <- ticks findAllIn mydata) println(inside) // multiple matches

val Some(ticks(inside)) = ticks findFirstIn mydata // may throw exception

val ticks = ".*'([^']*)'.*".r    
val ticks(inside) = mydata // safe, shorter, only gets the first set of ticks
2

String dataIWant = mydata.split("'")[1];

Siehe Live Demo

2
ZehnVon12

Ich stimme mit der Antwort von Mihai Toader überein, der wie ein Zauber wirkt. Nur eine kleine Änderung aufgrund der Updates.

let string = "fact-tab-1 extra stuff you dont care about"

let matchResult = string.match(/fact-tab-./);

console.log(matchResult)

console.log('The extracted part would be : ' + matchResult[0])
document.getElementById('result').innerHTML = 'The extracted part would be : ' + matchResult[0];
<div id="result">
</div>

Laufendes Beispiel: JSFiddle

0
kaushalop

Apache Commons Lang bietet eine Reihe von Hilfsprogrammen für die Java.lang-API, insbesondere String-Manipulationsmethoden. In Ihrem Fall sind Start- und Endteilzeichenfolge identisch. Rufen Sie einfach die folgende Funktion auf.

StringUtils.substringBetween(String str, String tag)

Ruft den String ab, der in zwischen zwei Instanzen desselben Strings verschachtelt ist.

Wenn der Anfangs- und der Endteilstring unterschiedlich sind, verwenden Sie die folgende überladene Methode.

StringUtils.substringBetween(String str, String open, String close)

Ruft den String ab, der zwischen zwei Strings verschachtelt ist.

Wenn Sie alle Instanzen der übereinstimmenden Teilzeichenfolgen möchten, verwenden Sie

StringUtils.substringsBetween(String str, String open, String close)

Durchsucht einen String nach Teilzeichenfolgen, die durch ein Start- und ein End-Tag begrenzt sind. Gibt alle übereinstimmenden Teilzeichenfolgen in einem Array zurück..

Für das fragliche Beispiel werden alle Instanzen der übereinstimmenden Teilzeichenfolge abgerufen

String[] results = StringUtils.substringsBetween(mydata, "'", "'");
0
Memin