2010-11-03 21 views
12

In una recente intervista mi è stato chiesto di decifrare questa regexCosa significa questa espressione regolare?

^\^[^^] 

Potete per favore aiutarmi con esso. Inoltre, si prega di fornire alcuni collegamenti dove posso imparare regex per le interviste.

+2

Sarebbe molto più chiaro se hai postato l'espressione regolare reale, non la stringa Java con le sue bbaacckkssllllaasshheesses dolorose e talvolta ingannevoli. – tchrist

+1

@tchrist - perché? ha detto che ** questa ** sequenza di personaggi gli è stata data in un'intervista, un'intervista relativa a Java, immagino, guardando il tag. (BTW - il tag regex è stato aggiunto da qualcun altro, originariamente era etichettato solo Java) –

+1

@Andreas_D, odio ammettere quante volte ho rovinato una regex di Java a causa del problema del backslash. Ora li leggo da un file di oggetti o come argomento da linea di comando per (cercare di) di evitare il problema. Anche così, c'è una grande differenza tra un letterale Java usato come regex e un'espressione regolare. È come combattere con il guscio, ma peggio. – tchrist

risposta

30

Si abbina stringhe che iniziano con ^ seguita da qualsiasi carattere diverso^.

Così sarebbe partita:

^foo 
^b 

ma non

foo 
^^b 

Spiegazione:

Caret (^) è un personaggio meta espressione regolare con due diversi significati:

Fuori classe (1 ° uso nella regex) funziona come punto di partenza.

All'interno la classe di caratteri si comporta come negatorese utilizzato come primo carattere della classe di caratteri (3 ° l'uso nel regex) .

Precedendo un'espressione regolare con \ lo sfugge (lo rende non speciale). Il secondo uso di ^ nella tua espressione regolare è sfuggito e corrisponde a un valore letterale ^ nella stringa.

All'interno di una classe di caratteri un ^ che è non il prima carattere della classe di caratteri è trattato alla lettera. Quindi il 4 ° uso nella tua espressione regolare è un valore letterale ^.

Alcuni altri esempi per far capire:

  • ^a                  : Partite stringa che inizia con a
  • ^ab              : stringa Risultati inizio con a seguita da b
  • [a]              : corrisponde a una stringa che ha un a
  • [^a]          : corrisponde a una stringa che non ha un a
  • ^a[^a]: Ma una stringa inizia con uno a seguito da qualsiasi carattere diverso da a.
+1

Questo è vero se si presume che l'espressione regolare sia racchiusa tra virgolette. Altrimenti, sarebbe letterale '\'. –

+2

@Matt: ho pensato che a causa del tag java. – mkb

+3

@ Matt, penso che sia un presupposto sicuro dato che se si intendeva il backs back letterale, la regex non avrebbe mai avuto una corrispondenza con nessuna stringa. –

2

Partita all'inizio della riga o una stringa seguita da un letterale \ seguita dalla all'inizio della riga o stringa di seguito da qualsiasi carattere che non è uno spazio, di ritorno o carattere di nuova riga

+0

Ecco un popolare sito per imparare regex: http://www.regular-expressions.info/tutorial.html –

+0

Questo è sbagliato: non puoi avere due marcatori di inizio/stringa/linea tramite '^' a meno che tu non sia in '(? m)' modalità. La risposta più ovvia è che si tratta di linee di corrispondenza che iniziano con un circonflesso seguito da qualsiasi carattere non circonflesso, ma questo è difficile da dire a causa degli slackbash Java stooopid. – tchrist

+0

Non ho detto che era corretto o che corrispondeva a qualsiasi cosa. Ho appena detto quello che dice. –

2

La prima ^ è l'inizio della linea.

il secondo è un carattere letterale di ^ (\ è sfuggire l'altro significato usuale di ^)

Il terzo è dire

una classe di caratteri che non comprende la carattere ^

Alcuni esempi per mostrare con rubino:

ruby-1.9.2-p0 > "hello" =~ /^h/ # it found a match at position 0 
=> 0 

ruby-1.9.2-p0 > "hello" =~ /^e/ # nil means can't find it 
=> nil 

ruby-1.9.2-p0 > "he^llo" =~ /\^/ # found at position 2 
=> 2 

ruby-1.9.2-p0 > "he^llo"[/[^^]*/] # anything repeatedly but not including the^character 
=> "he" 
+1

Ottima risposta. – aioobe

+0

@ 動靜 能量 - hai ignorato "il secondo" nei tuoi esempi - sarà abbinato solo se le stringhe iniziano con un '^'. E questo '^' fa parte della corrispondenza ("^ hel^lo" -> "^ hel") –

+0

il terzo caso nell'esempio è mostrare la corrispondenza del letterale '^' ... è ciò che intendi ? –

3

Sto testando questo regex here tuttavia non sembra essere valido.
Il primo ^ indica l'inizio della linea.
Il primo \ sfugge al seguente \.
Quindi il secondo "^" non è sfuggito Infine il primo accento all'interno delle parentesi quadre [^ funge da negazione e il secondo ^] non è sfuggito di conseguenza non è valido.

IMHO la corretta espressione regolare deve essere ^\^[^\^]
Ragazzi, confermare gentilmente.Molte grazie

+2

Penso che ci sia un'assunzione implicita che questo è racchiuso tra virgolette, quindi i due backslash sono necessari per sfuggire al secondo accento. –

+0

Grazie per quello, solo per essere sicuro – Philar

Problemi correlati