2015-02-15 14 views
5

Sono abbastanza sicuro che ho visto \R è stato introdotto nel Ruby2 in modo che corrisponda a capo, nonostante da dove sono venuti: unix \n, MacOS \r o Windows \r\n da qualche parte . Detto questo, Ruby2 dovrebbe trattare \R come %r{\r\n|\r|\n}.Rubino regex 'backslash R' alias ' R' modello

Questo funziona bene:

▶ "a\nb".match /\R/ 
#⇒ #<MatchData "\n"> 
▶ "a\rb".match /\R/ 
#⇒ #<MatchData "\r"> 
▶ "a\r\nb".match /\R/ 
#⇒ #<MatchData "\r\n"> 

anche se la fine della riga/feed sono combinati:

▶ "a\r\n\nb".match /\R{2}/ 
#⇒ #<MatchData "\r\n\n"> 

a meno che non si cerca di negare \R:

▶ "a\nb".match /[^\R]+/ 
#⇒ #<MatchData "a\nb"> 

Negare \n funziona bene anche se :

▶ "a\nb".match /[^\n]+/ 
#⇒ #<MatchData "a"> 

Sfortunatamente, \R è estremamente difficile da google. Né lo Regexp rdoc né lo Regular Expressions ne parlano.

Un qualsiasi guru di espressioni regolari potrebbe ignorare una spiegazione qui, in modo che fosse almeno facilmente consultabile?

Grazie in anticipo.

+1

Dopo aver letto la spiegazione di @ sawa, che sembra perfettamente ragionevole, mi chiedo se questo potrebbe essere un bug. Mi sembra che '" a \ nb ".match/[^ \ R] + /' dovrebbe funzionare nel modo previsto. Ho lasciato una mail a [K. Takata] (https://github.com/k-takata) che chiede di dare un'occhiata alla tua domanda. –

+0

@CarySwoveland Grazie per quello. D'altra parte, non penso che la disgiunzione delle espressioni atomiche possa essere [facilmente] negata. Semplicemente non dovremmo aspettarci il comportamento corretto tra parentesi quadre da non letterali, esattamente come non ci aspettiamo riferimenti arretrati (avendo apparentemente la stessa notazione) per agire correttamente all'interno del raggruppamento dei caratteri. – mudasobwa

risposta

4

Questo è dall'autore: https://github.com/k-takata/Onigmo/blob/master/doc/RE#L101. Si dice

\R  Linebreak 

     Unicode: 
      (?>\x0D\x0A|[\x0A-\x0D\x{85}\x{2028}\x{2029}]) 

     Not Unicode: 
      (?>\x0D\x0A|[\x0A-\x0D]) 

Che sembra rilevante qui alla tua domanda è che non è un gruppo di caratteri, ma è un elenco di alternative. Dato che la sequenza non è necessariamente un singolo personaggio, immagino che non possa essere trasformata in un gruppo di personaggi. Questo probabilmente interagisce in modo particolare con la negazione, che è destinata ad essere usata solo con caratteri e/o gruppi di caratteri.

+0

Grazie, questo riferimento è esattamente quello che mi mancava. Ti dispiacerebbe aggiornare il tuo riferimento per includere il punto di ancoraggio: https://github.com/k-takata/Onigmo/blob/master/doc/RE#L101 – mudasobwa

+0

@mudasobwa: Fatto. – Stephan202