Posso usare un OR in regex senza catturare ciò che è racchiuso?


115

Sto usando rubular.com per creare la mia regex e la loro documentazione descrive quanto segue:

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

Come posso utilizzare un'espressione OR senza catturare il contenuto? Ad esempio, supponi di voler acquisire "ac" o "bc". Non posso usare la regex

(a|b)(c)

giusto? Da allora ho catturato "a" o "b" in un gruppo e "c" in un altro, non lo stesso. So di poter filtrare i risultati acquisiti, ma sembra più lavoro ...

Mi sto perdendo qualcosa di ovvio? Lo sto usando in Java, se pertinente.


Bel +1 per il collegamento alla Rubular
bukowski

Risposte:


181

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

((?:a|b)c)

Ecco (?:a|b)un gruppo ma non puoi fare riferimento alla sua corrispondenza. Così si può fare riferimento solo alla partita di ((?:a|b)c)cui è o aco bc.


che ha fatto! Grazie per la risposta super veloce. Accetterò dopo la scadenza del limite di tempo (che non sapevo esistesse).
goggin13

4
Pensavo che l'idea non fosse quella di catturare il ao del btutto. In altre parole, per abbinare ac o bc, ma solo catturare il c:(?:a|b)(c)
Alan Moore

1
@AlanMoore È possibile catturare uno e non l'altro nell'istruzione or? Quindi sto cercando il modello aco ab, ma voglio produrre abse abe solo "c" è l'output "ac".
Moondra

24

Se la tua implementazione lo ha, puoi usare parentesi non di cattura:

(?:a|b)

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

3

Anche rubular non ti fa usare le parentesi e la precedenza di |è bassa. Ad esempio a | bc non corrisponde a ccc


cosa fa l'operatore "! ~"? Mi piace la tua espressione, con meno parentesi, regex è già abbastanza disordinato
goggin13

! ~ è un perlismo per "non corrisponde", è stata una scrittura sciatta da parte mia; risolto, grazie.
msw

2
Non ti capisco. La precedenza bassa di |è il motivo per cui non è necessario utilizzare parentesi. (?:a|b)ccorrisponde a aco bc(il comportamento desiderato), mentre a|bccorrisponde a ao bc.
Alan Moore

2

Se le tue alternative OR sono tutte caratteri singoli, puoi semplicemente usare l'operatore "set di caratteri":

([ab]c)

corrisponderà solo a aco bced è più leggibile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.