2012-06-07 22 views
6

Come si combina più di un carattere di spazio nell'espressione regolare di Java?Java Regex: come abbinare uno o più caratteri di spazio

Ho una regex che sto cercando di abbinare. La regex ha esito negativo quando ho due o più caratteri di spazio.

public static void main(String[] args) { 
    String pattern = "\\b(fruit)\\s+([^a]+\\w+)\\b"; //Match 'fruit' not followed by a word that begins with 'a' 
    String str = "fruit apple"; //One space character will not be matched 
    String str_fail = "fruit apple"; //Two space characters will be matched 
    System.out.println(preg_match(pattern,str)); //False (Thats what I want) 
    System.out.println(preg_match(pattern,str_fail)); //True (Regex fail) 
} 

public static boolean preg_match(String pattern,String subject) { 
    Pattern regex = Pattern.compile(pattern); 
    Matcher regexMatcher = regex.matcher(subject); 
    return regexMatcher.find(); 
} 
+1

'String $ pattern' =>' String pattern' in convenzioni di codifica standard Java. – assylias

+2

È ... sintassi di php nel codice Java? – ean5533

+3

Potrebbe essere che il secondo spazio sia abbinato a [^ a] (uno spazio non è un 'a') – erikxiv

risposta

12

Il problema è in realtà a causa di backtracking. La vostra espressione regolare:

"\\b(fruit)\\s+([^a]+\\w+)\\b" 

dice "di frutta, seguita da uno o più spazi, seguito da uno o più caratteri 'a' non, seguito da uno o più caratteri 'parola'". Il motivo per cui questo non riesce con due spazi è perché \s+ corrisponde al primo spazio, ma poi restituisce il secondo, che soddisfa quindi lo [^a]+ (con il secondo spazio) e la porzione \s+ (con il primo).

Penso che sia possibile risolvere il problema semplicemente utilizzando il quantificatore posessivo invece, che sarebbe \s++. Ciò indica allo \snon di restituire il secondo carattere di spazio. È possibile trovare la documentazione sui quantificatori di Java here.


A titolo di esempio, ecco due esempi a Rubular:

(risultati attesi, dà da ciò che si descrive)
  1. Using the possessive quantifier on \s
  2. Your current regex with separate groupings around [^a\]+ and \w+. Si noti che il secondo gruppo di corrispondenza (che rappresenta lo [^a]+) sta acquisendo un secondo carattere di spazio.
+0

Analisi corretta e una soluzione valida. Una seconda soluzione possibile sarebbe cambiare '[^ a]' in '[^ a \ s]'. – ean5533

+0

@eldarerathis La soluzione \\ s ++ funziona. – MontrealDevOne

Problemi correlati