web-dev-qa-db-fra.com

Obtenir le texte qui suit après le match regex

Je ne connais pas Regex pour la première fois, je suis passé par une série de tutoriels, mais je n’en ai trouvé aucun qui corresponde à ce que je veux faire.

Je veux chercher quelque chose, mais je retourne tout ce qui suit, mais pas la chaîne de recherche elle-même

par exemple. " Une phrase boiteuse qui est géniale "

rechercher " phrase "

retourne " c'est génial "

Toute aide serait très appréciée

Ceci est mon regex jusqu'à présent

sentence(.*) 

mais cela retourne: phrase géniale

Pattern pattern = Pattern.compile("sentence(.*)");

Matcher matcher = pattern.matcher("some lame sentence that is awesome");

boolean found = false;
while (matcher.find())
{
    System.out.println("I found the text: " + matcher.group().toString());
    found = true;
}
if (!found)
{
    System.out.println("I didn't find the text");
}
58
Scott

Vous pouvez le faire avec "uniquement l'expression régulière" comme vous l'avez demandé dans un commentaire:

(?<=sentence).*

(?<=sentence) est un assertion de regard positif . Cela correspond à une certaine position de la chaîne, à savoir juste après le texte sentence sans que ce texte fasse lui-même partie de la correspondance. Par conséquent, (?<=sentence).* correspondra à tout texte après sentence.

C'est une fonctionnalité intéressante de regex. Cependant, dans Java, cela ne fonctionnera que pour les sous-expressions de longueur finie, c'est-à-dire, e. (?<=sentence|Word|(foo){1,4}) est légal, mais (?<=sentence\s*) n'est pas.

91
Tim Pietzcker

Votre regex "sentence(.*)" a raison. Pour récupérer le contenu du groupe entre parenthèses, appelez:

Pattern p = Pattern.compile( "sentence(.*)" );
Matcher m = p.matcher( "some lame sentence that is awesome" );
if ( m.find() ) {
   String s = m.group(1); // " that is awesome"
}

Notez l’utilisation de m.find() dans ce cas (tente de trouver n’importe où dans la chaîne) et non pas m.matches() (échouerait à cause du préfixe "un peu boiteux"; dans ce cas, la regex doit être ".*sentence(.*)")

16
st.never

si Matcher est initialisé avec str, après le match, vous pouvez obtenir la partie après le match avec

str.substring(matcher.end())

Exemple de code:

final String str = "Some lame sentence that is awesome";
final Matcher matcher = Pattern.compile("sentence").matcher(str);
if(matcher.find()){
    System.out.println(str.substring(matcher.end()).trim());
}

Sortie:

c'est génial

8
Sean Patrick Floyd

Vous avez juste besoin de mettre "group (1)" au lieu de "group ()" dans la ligne suivante et le retour sera celui que vous attendiez:

System.out.println("I found the text: " + matcher.group(**1**).toString());
1
Ricardo Ferreira

Vous devez utiliser le groupe (int) de votre matcher - le groupe (0) est l’ensemble du match et le groupe (1) est le premier groupe marqué. Dans l'exemple que vous spécifiez, le groupe (1) est ce qui vient après "phrase".

1
Rami C