110 votes

Obtenir le texte qui suit la correspondance de l'expression rationnelle

Je suis novice dans l'utilisation des Regex, j'ai parcouru une multitude de tutoriels mais je n'en ai pas trouvé un qui s'applique à ce que je veux faire,

Je veux rechercher quelque chose, mais renvoyer tout ce qui suit, mais pas la chaîne de recherche elle-même.

par exemple " Une phrase nulle mais géniale "

rechercher " condamnation "

retourner " c'est génial "

Toute aide serait très appréciée

Voici ma regex jusqu'à présent

sentence(.*) 

mais il revient : Cette phrase est 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");
}

192voto

Tim Pietzcker Points 146308

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

(?<=sentence).*

(?<=sentence) est un affirmation positive du regard porté sur l'arrière . Cette correspondance se fait à une certaine position dans la chaîne, à savoir juste après le texte sentence sans que ce texte ne fasse lui-même partie du match. En conséquence, (?<=sentence).* correspondra à tout texte situé après sentence .

Il s'agit d'une fonctionnalité intéressante des expressions rationnelles. Cependant, en Java, cela ne fonctionnera que pour les sous-expressions de longueur finie, c'est-à-dire (?<=sentence|word|(foo){1,4}) est légal, mais (?<=sentence\s*) ne l'est pas.

21voto

st.never Points 3316

Votre expression rationnelle "sentence(.*)" a raison. Pour récupérer le contenu du groupe entre parenthèses, vous devez appeler :

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 "some lame" ; dans ce cas, la regex devrait être ".*sentence(.*)" )

10voto

Sean Patrick Floyd Points 109428

Si le 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

2voto

Rami C Points 456

Vous devez utiliser le groupe(int) de votre outil de recherche - group(0) est l'ensemble de la correspondance, et group(1) est le premier groupe que vous avez marqué. Dans l'exemple que vous avez spécifié, group(1) est ce qui vient après " condamnation ".

2voto

Il suffit 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());

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X