2010-07-31 15 views
58

Sto usando rubular.com per costruire la mia regex, e la loro documentazione descrive il seguente:Posso usare un OR nella regex senza catturare ciò che è racchiuso?

(...) Capture everything enclosed 
(a|b) a or b 

Come posso usare un'espressione OR senza catturare ciò che è in esso? Quindi, se voglio per corrispondenza "o un b seguito da un c", e catturare solo la c, non posso usare

(a|b)(c) 

giusto? Quindi catturo sia "a o b" che "c". So che posso filtrare attraverso i risultati catturati, ma sembra più lavoro ...

Mi manca qualcosa di ovvio? Sto usando questo in Java, se questo è pertinente.

+0

Nice one +1 per il link a rubino – fjckls

risposta

97

seconda dell'implementazione espressione regolare è possibile utilizzare i cosiddetti gruppi non-cattura con la sintassi (?:…):

((?:a|b)c) 

Qui (?:a|b) è un gruppo, ma non è possibile fare riferimento la sua partita. Quindi puoi solo fare riferimento alla corrispondenza di ((?:a|b)c) ovvero ac o bc.

+0

che lo ha fatto! Grazie per la risposta super veloce. Accetterò dopo che il limite di tempo (che non sapevo esistesse) scade. – goggin13

+3

Pensavo che l'idea non fosse affatto quella di acquisire 'a' o' b'. In altre parole, per * match * 'ac' o' bc', ma solo * capture * the 'c':' (?: A | b) (c) ' –

+0

@AlanMoore E 'possibile catturarne uno e non il altro nella o dichiarazione? Quindi sto cercando il pattern 'ac' o' ab', ma voglio produrre 'ab' se' ab' e solo 'c' viene emesso 'ac'. – Moondra

13

Se l'implementazione ha, quindi è possibile utilizzare parentesi non-cattura:

(?:a|b) 
+0

@mmutz Grazie per la risposta veloce! Vorrei poter accettare entrambe le risposte, era proprio quello che stavo cercando – goggin13

1

Anche Rubular non rende utilizzare parentesi e la precedenza delle | è basso. Per esempio a|bc does not match ccc

+0

cosa fa l'operatore '! ~'? Mi piace la tua espressione, con un minor numero di parenti, l'espressione regolare è già abbastanza confusa – goggin13

+0

! ~ È un perlismo per "non combacia", è stata una scrittura trascurata da parte mia; risolto, grazie. – msw

+0

getcha; grazie per il link! – goggin13

Problemi correlati