TLDR; (?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
Wygląda na to, że chcesz „xn razy” lub „xm razy”, myślę, że dosłowne tłumaczenie wyrażenia regularnego wyglądałoby (x{n}|x{m}).
tak: https://regex101.com/r/vH7yL5/1
lub w przypadku, gdy możesz mieć sekwencję większą niż m „x” s (zakładając m> n), możesz dodać „po braku” x ”i„ po którym nie ma „x”, co oznacza [^x](x{n}|x{m})[^x]
, że załóż, że za tobą i za tobą zawsze jest znak "x". Jak widać tutaj: https://regex101.com/r/bB2vH2/1
możesz to zmienić na (?:[^x]|^)(x{n}|x{m})(?:[^x]|$)
, tłumacząc na „następujący po braku 'x' lub następujący po początku linii” i „po którym następuje brak 'x' lub po którym następuje koniec linii”. Ale nadal nie będzie pasował do dwóch sekwencji z tylko jednym znakiem między nimi (ponieważ pierwsze dopasowanie wymagałoby znaku po, a drugie znaku wcześniej), jak widać tutaj: https://regex101.com/r/ oC5oJ4 / 1
Na koniec, aby dopasować odległe dopasowanie o jeden znak, możesz dodać pozytywne spojrzenie w przód (? =) Na „brak 'x' po” lub pozytywne spojrzenie w tył (? <=) Na „brak 'x” przed ”, w ten sposób: https://regex101.com/r/mC4uX3/1
(?<=[^x]|^)(x{n}|x{m})(?:[^x]|$)
W ten sposób dopasujesz tylko dokładną liczbę „x”, jaką chcesz.
X
jest najlepszy można dostać za ogólnym
,n
.