2008-12-09 4 views
4

Les expressions régulières semblent correspondre à la correspondance la plus longue possible. Par exemple:Négation de chaînes littérales dans une expression régulière Java

public static void main(String[] args) { 
    String s = "ClarkRalphKentGuyGreenGardnerClarkSupermanKent"; 
    Pattern p = Pattern.compile("Clark.*Kent", Pattern.CASE_INSENSITIVE); 
    Matcher myMatcher = p.matcher(s); 
    int i = 1; 
    while (myMatcher.find()) { 
     System.out.println(i++ + ". " + myMatcher.group()); 
    } 
} 

génère la sortie

  1. ClarkRalphKentGuyGreenGardnerClarkSupermanKent

Je voudrais que cette sortie

  1. ClarkRalphKent
  2. ClarkSupermanKent

J'ai essayé des modèles comme:

Pattern p = Pattern.compile("Clark[^((Kent)*)]Kent", Pattern.CASE_INSENSITIVE); 

qui ne fonctionnent pas, mais vous voyez ce que je veux dire. Je veux que la chaîne de Clark à Kent ne contienne aucune occurrence de Kent.

Cette chaîne:

ClarkRalphKentGuyGreenGardnerBruceBatmanKent

devrait générer une sortie

  1. ClarkRalphKent

Répondre

6

gourmande vs réticente est votre ami ici.

essayer: Clark.+?Kent

2

Utilisez le suffixe ? relunctant: Clark.*?Kent Les quantificateurs ?, *, + peut être suivie par ? pour indiquer qu'ils devraient cesser le plus tôt possible.

voir http://perldoc.perl.org/perlre.html

+0

voir http://perldoc.perl.org/perlre.html –

4

Vous voulez un quantificateur "réticent" plutôt qu'un "gourmand". Il suffit de mettre un? après votre * devrait faire l'affaire.

3

Lorsque vous avez essayé "Clark[^((Kent)*)]Kent", je pense que vous vouliez "Clark((?!Kent).)*Kent" pour zero-width negative look-ahead (faites défiler un peu vers l'en-tête "Look-Around Assertions").

Les parenthèses spécifient la correspondance de caractères par rapport à la correspondance de modèle. Ainsi, le RegExp essayait de trouver un seul caractère pas dans (, K, e, n, t,), *.

Questions connexes