Regex esattamente n OR m volte

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})