TLDR; (?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
Parece que você quer "xn times" ou "xm times", acho que uma tradução literal para regex seria (x{n}|x{m}).
assim https://regex101.com/r/vH7yL5/1
ou, em um caso onde você pode ter uma sequência de mais de m "x" s (assumindo m> n), você pode adicionar 'não seguindo "x"' e 'seguido por nenhum "x", traduzindo para [^x](x{n}|x{m})[^x]
mas isso seria suponha que sempre há um caractere atrás e depois de "x" s. Como você pode ver aqui: https://regex101.com/r/bB2vH2/1
você pode alterá-lo para (?:[^x]|^)(x{n}|x{m})(?:[^x]|$)
, traduzindo para "não seguindo 'x' ou seguindo o início da linha" e "seguido por nenhum 'x' ou seguido pelo fim da linha". Mas, ainda assim, não combinará duas sequências com apenas um caractere entre elas (porque a primeira correspondência exigiria um caractere depois, e a segunda um caractere antes) como você pode ver aqui: https://regex101.com/r/ oC5oJ4 / 1
Finalmente, para combinar a correspondência distante de um caractere, você pode adicionar um olhar positivo para frente (? =) No "não 'x' depois" ou um olhar positivo para trás (? <=) No "não 'x' antes", assim: https://regex101.com/r/mC4uX3/1
(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
Dessa forma, você corresponderá apenas ao número exato de 'x's que deseja.
X
é o melhor que você pode obter para o geralm
,n
.