2015-05-22 12 views
5

Abbiamo un'espressione regolare abbastanza complessa che controlla la struttura delle stringhe.Come ottenere il primo carattere che sta causando la non corretta espressione del reg.

Mi chiedo se esiste un modo semplice per scoprire quale carattere nella stringa che sta causando l'espressione di reg non corrispondente.

Ad esempio,

string.match(reg_exp).get_position_which_fails 

Fondamentalmente, l'idea è come ottenere "posizione" della macchina a stati quando rinunciato.

Ecco un esempio di espressione regolare:

%q^[^\p{Cc}\p{Z}]([^\p{Cc}\p{Zl}\p{Zp}]{0,253}[^\p{Cc}\p{Z}])?$ 
+4

Cosa fallisce in "abad'match/ae /'? Questo problema non ha semplicemente una soluzione adeguata. – mudasobwa

+0

Potrebbe essere d'aiuto se potessi pubblicare l'espressione regolare. – hwnd

+0

Si desidera trovare quanti caratteri sono abbinati prima del primo errore. Se l'espressione da abbinare è abbastanza semplice, è possibile creare un'espressione regolare che sarà sempre corrispondente e che raccoglierà buoni gruppi lungo la strada. Qualcosa come '/ (f?) (A?) (I?) (L?) (H?) (E?) (R?) (E?) /' Che corrisponderà ai primi 4 caratteri di "failNow". [Test] (https://regex101.com/r/uM4vB7/1) –

risposta

7

La risposta breve è: No.

La risposta lunga è che un'espressione regolare è una macchina a stati finiti complicata che potrebbe trovarsi in uno stato che tenta di associare contemporaneamente diversi percorsi possibili. Non c'è modo di ottenere una corrispondenza parziale con un'espressione regolare senza costruire un'espressione regolare che consenta corrispondenze parziali.

Se si desidera consentire le corrispondenze parziali, riprogettare l'espressione per supportarle o scrivere un parser che passi attraverso la stringa utilizzando un metodo più manuale.

Si potrebbe provare a generare uno di questi automaticamente con Ragel se si dispone di un'espressione particolarmente difficile da risolvere.

Problemi correlati