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";
289
demandé sur Templar 2011-01-11 23:22:49

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
449
répondu Mark Byers 2016-05-06 11:05:46

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, "'");
54
répondu Beothorn 2014-01-25 21:13:31
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));
        }

    }
}
9
répondu Sean McEligot 2011-01-11 20:40:47

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)
9
répondu Debilski 2011-01-11 21:03:46

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 .

5
répondu Bohemian 2017-01-14 23:46:37
String dataIWant = mydata.replaceFirst(".*'(.*?)'.*", "$1");
4
répondu ZehnVon12 2017-09-13 08:28:21

, 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.

2
répondu Mihai Toader 2011-01-11 20:26:49

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
2
répondu Daniel C. Sobral 2011-01-11 22:32:48

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

Voir Démo En Direct

1
répondu ZehnVon12 2017-08-18 13:08:06