Considera la seguente espressione regolare, where X
è una qualsiasi espressione regolare.
X{n}|X{m}
Questa regex testerebbe per X
verifica esattamente n
o m
volte.
Esiste un quantificatore di espressioni regolari in grado di testare un'occorrenza X
esattamente n
o m
volte?
Non esiste un singolo quantificatore che significhi "esattamente m o n volte". Il modo in cui lo stai facendo va bene.
Un'alternativa è:
X{m}(X{k})?
where m < n
e k
è il valore di nm
.
Ecco la list completa dei quantificatori (ref http://www.regular-expressions.info/reference.html ):
?
, ??
– 0 o 1 occorrenza ( ??
è pigro,? È avido) *
, *?
– qualsiasi numero di occorrenze +
, +?
– alless un evento {n}
– esattamente n
occorrenze {n,m}
– n
in m
occorrenze, inclusive {n,m}?
– n
a m
occorrenze, pigro {n,}
, {n,}?
– alless n
Per get "esattamente N o M", è necessario scrivere la regex quantificata due volte, a less che m, n non siano speciali:
X{n,m}
se m = n+1
(?:X{n}){1,2}
se m = 2n
No, non esiste un tale quantificatore. Ma lo ristrutturerei in /X{m}(X{mn})?/
Per prevenire problemi nel backtracking .
TLDR; (?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
Sembra che tu voglia "xn times" o "xm times", penso che una traduzione letterale alla regex sia (x{n}|x{m}).
Mi piace questo https://regex101.com/r/vH7yL5/1
oppure, nel caso in cui tu possa avere una sequenza di più di m "x" s (assumendo m> n), puoi aggiungere 'following no "x"' e 'seguito da no "x", traducendo in [^x](x{n}|x{m})[^x]
ma ciò presupporrebbe che ci sia sempre un personaggio dietro e dopo te "x" s. Come puoi vedere qui: https://regex101.com/r/bB2vH2/1
puoi cambiarlo in (?:[^x]|^)(x{n}|x{m})(?:[^x]|$)
, traducendo in "following no 'x' o following line start" e "seguito da no 'x' o seguito da fine row". Tuttavia, non corrisponderà a due sequenze con un solo carattere tra loro (perché la prima corrispondenza richiederebbe un carattere dopo, e la seconda un carattere prima) come puoi vedere qui: https://regex101.com/r/ oC5oJ4 / 1
Infine, per abbinare la corrispondenza distante di un personaggio, puoi aggiungere uno sguardo positivo avanti (? =) Sul "no" x "dopo" o uno sguardo positivo dietro (? <=) Sul "no" x "prima", in questo modo: https://regex101.com/r/mC4uX3/1
(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
In questo modo abbinerai solo il numero esatto di 'x' che vuoi.
Puoi anche hardcode, (X{n})|(X{m})