2010-10-19 10 views
5

Come faccio a dire, nelle espressioni regolari:Aiuto con particolare Espressione regolare - senza qualche stringa

Ogni porzione di una stringa che inizia con la lettera maiuscola, contenente almeno un carattere di spazio, che non contengono la stringa
" _ " (spazio di sottolineatura dello spazio) e termina con la stringa "!!!" (senza le virgolette)?

Ho problemi con la parte "non contenente".

Ecco quello che ho finora:

[A-Z].* .*!!! 

Come faccio a modificare questo per specificare anche "non contenenti '_'"?

Non è necessario che sia la stringa specifica "_". Come posso dire "non contenente" ANY stringa? Ad esempio non contenente "cane"?

Edit: Mi piacerebbe la soluzione per essere compatibile con "preg_replace" PHP

Edit: Esempi:

Esempi per "_":

Abc xyz !!! < --- Corrispondenze

Ciao mondo !!! < --- Corrispondenze

Ha _ Spazio Sottolinea Spazio !!! < --- non corrisponde

Esempi "dog":

Che un cane !!! < --- Non corrisponde, (contiene "cane")

Ciao mondo !!! < --- Corrispondenze

+4

Ciao, che lingua stai usando? Perl Reg.exps? ECMAScript? – Benoit

+0

Puoi pubblicare alcuni esempi di stringhe valide/non valide? – Kobi

risposta

2

Il x(?!y) espressione corrisponde x solo se non è immediatamente seguito da y. Quindi, questo sembra essere la cosa che si desidera:

[A-Z](?!%s)(.(?!%s))* (.(?!%s))*!!! 

Dove %s è la stringa di proibito.

1

Qualsiasi regex possibile per questo sarebbe probabilmente molto più complicato di due regex. Uno come il tuo: [A-Z].* .*!!! e il secondo applicato su stringhe corrispondenti e verifica se _ è contenuto.

+0

Sfortunatamente, ho bisogno di "catturare" la porzione corrispondente della stringa, quindi ho bisogno di una singola regex per questo. – Joshua

0

Inizia con qualsiasi capitale; avere una stringa opzionale di tutto tranne un trattino basso, uno spazio, e quindi il tutto eccetto di nuovo sottolineato, seguito da tre punti esclamativi.

[A-Z][^_]*[ ][^_]*!!! 
+0

Non corrisponderà a 'Abc_d ef !!!' – Benoit

+0

Come dovrei applicare questo nel caso dell'esempio "cane", nella mia modifica sopra? – Joshua

0

Primo test la stringa per qualsiasi occorrenza di "_", dal momento che è un fiammifero. Quindi controlla quello che vuoi.

Questo è quello che farei invece di trascorrere molto tempo cercando di capire un'espressione regolare per questo.

Ecco un bel sito per testare le espressioni: Nregex

Edit: Ho letto ancora un po 'sulla sua domanda e vedere che la mia risposta non era davvero buono, ecco un altro tentativo. Una modifica di una delle espressioni di cui sopra:

[A-Z](?! _)(\w(?! _))* (\w(?! _))*!!! 
0
[A-Z]([^ ]*(?! _) ?)*!!! 

Edit: ho perso il vostro requisito per almeno uno spazio. L'espressione regolare sotto include tale obbligo:

[A-Z][^ ]* (?!_)((?! _).)*!!! 
0

ho usato per risolverlo tramite l'opzione grep s' -v (se sono su Linux e/o posso utilizzare grep).

Quindi cercare qualcosa, quindi saltare le parti non interessanti.

grep something <INPUT> | grep -v uninteresting 

Senza grep (accidenti a finestre, senza privilegi di amministratore), ma con Vim:

vim -c "v/i'm searching for this/d" -c "g/and don't need this/d" -c "w checkoutput" <INPUT> 

(Questo apre, quindi elimina ogni linea ciò non corrisponde a ciò che è necessario, quindi elimina ogni linea, cosa voi non ha bisogno, quindi salvare i risultati come checkoutput. il che si dovrebbe verificare.)

HTH

Problemi correlati