J'ai une chaîne qui contient deux guillemets simples, le caractère '
. Entre les guillemets simples se trouvent les données que je veux.
Comment puis-je écrire une regex pour extraire "les données que je veux" du texte suivant?
mydata = "some string with 'the data i want' inside";
En supposant que vous souhaitiez la partie entre guillemets simples, utilisez cette expression régulière avec un Matcher
:
"'(.*?)'"
Exemple:
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));
}
Résultat:
les données que je veux
Vous n'avez pas besoin de regex pour cela.
Ajoutez Apache commons lang à votre projet ( http://commons.Apache.org/proper/commons-lang/ ), puis utilisez:
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));
}
}
}
Parce que vous avez également coché Scala, une solution sans regex qui gère facilement plusieurs chaînes entre guillemets:
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)
Il y a une simple ligne pour cela:
String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");
En rendant le groupe de correspondance facultatif, cela évite également que des devis soient trouvés en renvoyant un blanc dans ce cas.
Voir démo en direct .
String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1");
comme en javascript:
mydata.match(/'([^']+)'/)[1]
l'expression rationnelle réelle est: /'([^']+)'/
si vous utilisez le modificateur non glouton (comme dans un autre post), c'est comme ça:
mydata.match(/'(.*?)'/)[1]
c'est plus propre.
En 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
Je suis d'accord avec la réponse ci-dessus par Mihai Toader fonctionne comme un charme. Juste une petite modification en fonction des mises à jour.
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>
Exemple courant: JSFiddle
Apache Commons Lang fournit un hôte d'utilitaires d'aide pour l'API Java.lang, notamment des méthodes de manipulation de chaînes. Dans votre cas, les sous-chaînes de début et de fin sont identiques, appelez simplement la fonction suivante.
StringUtils.substringBetween(String str, String tag)
Obtient la chaîne imbriquée dans entre deux instances de la même chaîne.
Si les sous-chaînes de début et de fin sont différentes, utilisez la méthode surchargée suivante.
StringUtils.substringBetween(String str, String open, String close)
Obtient la chaîne imbriquée entre deux chaînes.
Si vous voulez toutes les occurrences des sous-chaînes correspondantes, utilisez,
StringUtils.substringsBetween(String str, String open, String close)
Recherche dans une chaîne des sous-chaînes délimitées par une balise de début et de fin, retourne toutes les sous-chaînes correspondantes d'un tablea.
Pour que l'exemple en question obtienne toutes les instances de la sous-chaîne correspondante
String[] results = StringUtils.substringsBetween(mydata, "'", "'");