2015-08-30 22 views
6

Ho un'espressione regolare per estrarre due token, delimitatori ['] e parole tra gli apostrofi come' Stack Overflow '. La domanda è: perché questa espressione regolare non funziona?Perché questa espressione regolare non funziona?

Regex:

(['])|'([^']*)' 

Ecco un link per spiegarlo: Regular Expression

Funziona solo apostrofi estrazione ma, parole tra apostrofi non.

NOTA: È necessario estrarre l'apostrofo e qualsiasi parola tra l'apostrofo separatamente come "Stack Overflow".

Il risultato sarebbe come:

  1. '
  2. Stack Overflow
  3. '

Saluti.

+0

Ok, inizi con "Ho un'espressione regolare ...". Che ne dici di postare l'espressione regolare che hai? Allora possiamo aiutarti. –

+0

Ho pubblicato un collegamento. –

+1

@ JesúsA.MezaG. Cosa succede se quel collegamento scompare, come potrebbero i futuri lettori sapere di cosa tratta questa domanda? Meglio includere le parti rilevanti della domanda direttamente nella domanda –

risposta

5

L'espressione regolare dice che corrisponde a una singola citazione o al contenuto tra virgolette, ma è esclusiva o il modo in cui l'hai. Per ottenere ciascuno di loro come un gruppo di cattura è possibile utilizzare l'espressione regolare:

(')([^']*)(') 

per ottenere la prima citazione, quindi tutto ciò che non è una citazione poi l'ultima citazione

+1

Questo funziona. Sìì! –

4

TL; DR Perché è short-circuit .

Nella condizione or, una volta trovata la prima espressione regolare, non è necessario valutare la seconda espressione regolare. perché True | anything ottiene sempre True, giusto?

Considerate la vostra espressione regolare

regex = (['])|'([^']*)' 
text = 'Stack Overflow' 

Run regex per abbinare stringa nel text

([']) partite per ' e ', poi catturarli in $1 e $2.

terminato!(Saltare il secondo regex perché li si collega con or)

Un'altra prova:

regex = (['])|'([^']*)' 
text = 'Stack Overflow' 

ottenere

$1 = `'` 
$2 = `'` 

ma

regex = '([^']*)'|([']) 
text = 'Stack Overflow' 

ottenere

$1 = `Stack Overflow` 

Vedrai che solo il primo è lavoro!

Così, vi consiglio di utilizzare questa regex invece di:

(')(.*?)(') 

dove si ottiene i vostri testi catturati in $1, $2, $3 rispettivamente.

Nota che *? è un quantificatore non greedy, la spiegazione semplice è: non consumerà arbitrariamente il tuo '.

Problemi correlati