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";
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
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, "'");
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));
}
}
}
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)
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 .
String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1");
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.
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
String dataIWant = mydata.split("'")[1];
Siehe Live Demo
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
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, "'", "'");