Comment extraire une sous-chaîne en utilisant regex
J'ai une chaîne qui contient deux guillemets simples, le caractère '
. Entre les guillemets simples sont les données que je veux.
Comment puis-je écrire une expression rationnelle pour extraire" les données que je veux " du texte suivant?
mydata = "some string with 'the data i want' inside";
9 réponses
En supposant que vous voulez 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:
the data i want
Vous n'avez pas besoin de regex pour cela.
Ajouter 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 traite facilement avec 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 un simple one-liner pour cela:
String target = myData.replaceAll("[^']*(?:'(.*?)')?.*", "$1");
En rendant le groupe correspondant facultatif, cela répond également aux guillemets qui ne sont pas trouvés en retournant un vide dans ce cas.
Voir démo en direct .
String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1");
, Comme dans javascript:
mydata.match(/'([^']+)'/)[1]
L'expression rationnelle réelle est: /'([^']+)'/
Si vous utilisez le modificateur non gourmand (selon un autre article), c'est comme ceci:
mydata.match(/'(.*?)'/)[1]
C'est plus propre.
Dans 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];
Voir Démo En Direct