web-dev-qa-db-fra.com

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

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 
476
Mark Byers

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, "'");
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

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)
9
Debilski

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 .

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

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.

3
Mihai Toader

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
2
Daniel C. Sobral

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

0
kaushalop

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, "'", "'");
0
Memin