2015-01-14 17 views
6

In una frase simile a:Come abbinare '+ abc' ma non '++ abc' senza lookbehind?

Lorem ipsum dolor + ++ sit amet.

Mi piacerebbe abbinare il +dolor ma non lo ++sit. Posso farlo con un lookbehind ma dal momento che lo JavaScript non lo supporta, sto faticando a creare un modello per questo.

Finora ho provato con:

(?:\+(.+?))(?=[\s\.!\!]) - but it matches both words 
(?:\+{1}(.+?))(?=[\s\.!\!]) - the same here - both words are matched 

e con mia sorpresa un modello come:

(?=\s)(?:\+(.+?))(?=[\s\.!\!]) 

non corrisponde nulla. Ho pensato di poterlo ingannare e utilizzare o successivo anche il ^ prima del segno + ma non sembra funzionare così.


EDIT - informazioni di base:

non è necessariamente parte della domanda, ma a volte è bene sapere che cosa è questo tutto bene per così tanto per chiarire alcune delle vostre domande/commenti una breve spiegazione:

  • qualsiasi parola in qualsiasi ordine può venire marcato sia da un + o ++
  • ogni parola ed è marcatura sarà sostituito da un <span> successiva
  • casi come lorem + ipsum sono concidered invalide perché sarebbe come dividere una parola (ro + om) o scrivere due parole insieme come una parola (myroom) quindi deve essere corretto comunque (il modello può corrispondere a questo ma non è un errore) dovrebbe comunque almeno corrispondere ai normali casi, come nell'esempio di cui sopra
  • io uso un lookahead come (?=[\s\.!\!]) in modo che possa corrispondere le parole in qualsiasi lingua un non solo caratteri \w
+0

vuoi abbinare '+ bar' in' foo + bar'? –

+0

No, è una frase e non ci saranno casi del genere. Ci sarà sempre uno spazio '\ s' o'^'prima di' + '. – t3chb0t

+0

allora perché hai accettato la risposta che cattura '+ bar' in' foo + bar'? –

risposta

3

Un modo potrebbe essere quello di abbinare un carattere aggiuntivo e ignorare che (mettendo la parte rilevante della partita in un gruppo di cattura):

(?:^|[^+])(\+[^\s+.!]+) 

Tuttavia, ciò si interrompe se le potenziali corrispondenze potrebbero essere direttamente adiacenti l'una all'altra.

Provalo live on regex101.com.

Spiegazione:

(?:   # Match (but don't capture) 
^   # the position at the start of the string 
|   # or 
[^+]  # any character except +. 
)   # End of group 
(   # Match (and capture in group 1) 
\+   # a + character 
[^\s+.!]+ # one or more characters except [+.!] or whitespace. 
)   # End of group 
+0

È difficile scegliere una risposta, ma penso che questo mi ha portato nella giusta direzione e andrò con un modello come '(?:^| \ S) (\ + ([^ + \ s] +)) (? = [\ s \.! \!]) 'che è il tipo di combinazione di entrambi i modelli. Abbinare il carattere aggiuntivo all'inizio ha fatto il trucco. Ho aggiunto un altro gruppo perché ho bisogno di sostituirlo in seguito in modo da risolvere questo particolare problema. – t3chb0t

0

Basta provare con seguente espressione regolare:

(^|\s)\+\w+ 
+0

ma questo corrisponde anche allo spazio precedente. –

+0

@AvinashRaj: Penso che non sia importante - il testo può essere ottenuto con il gruppo di cattura comunque. – nhahtdh

+0

ma la tua regex corrisponde '+ dolor' anche a questa stringa' foo + dolor'. –

3
\+\+|(\+\S+) 

Grab il contenuto dal gruppo di cattura 1. La regex usa il trucco descritto in this answer.

Demo on regex101

var re = /\+\+|(\+\S+)/g; 
var str = 'Lorem ipsum +dolor ++sit ame'; 
var m; 
var o = []; 

while ((m = re.exec(str)) != null) { 
    if (m.index === re.lastIndex) { 
     re.lastIndex++; 
    } 

    if (m[1] != null) { 
     o.push(m[1]); 
    } 

} 

Se si dispone di ingresso come +++donor, uso:

\+\++|(\+\S+) 
+0

why downvoted ????????/ – vks

+1

Chiunque l'abbia fatto ovviamente non conosce la differenza tra le corrispondenze di cattura e non di cattura ... @ t3chb0t Penso che dovresti accettare questa risposta perché non soffre problemi con partite adiacenti come '+ dolor + sit' (dove il mio troverebbe solo + dolor'). –

+0

@TimPietzcker deve rimpiazzare quelli catturati con qualcos'altro.Pertanto potrebbe essere meglio sostituire in questo richiederà più sforzo. – vks

1

Penso che questo è quello che ti serviva.

(?:^|\s)(\+[^+\s.!]*)(?=[\s.!]) 
Problemi correlati