Match Single Character But Not Multiple
Solution 1:
I think this matches your intent.
^(?:(x[^x]{3}x)|x{2,}(x[^x]{3}x)x{2,})$
It is split into two parts, OR'd together:
(x[^x]{3}x)
matches the case of exactly x...x
and x{2,}(x[^x]{3}x)x{2,}
matches xxx...xxx
but not xx...xx
Note: This does not help you for unbalanced matches. E.g. for example (xxx...xxxx)
would still match the regex. However, as far as I know, you can't solve that problem with just a regex. You would need a stack to do so.
Solution 2:
If the leading number of times x should be the same as the trailing number times you could use a backreference to capturing group 1:
From the beginning of the string ^
, capture in group 1 zero or more times an x
. Then capture in group 2 an x
, one or more times not an x
followed by an x (x[^x]+x)
using a negated character class. This group will contain your match.
At the end use a backreference \1
to match the same again as in group 1 and assert the end of the string $
.
const strings = [
"x...x",
"xx...x",
"xx...",
"xx..xx",
"xxx...xxx",
"xxxx...xxxx",
];
let pattern = /^(x*)(x[^x]+x)(\1)$/;
strings.forEach((s) => {
let res = s.match(pattern);
if (res) {
console.log(s + " --> " + s.match(pattern)[2]);
} else {
console.log(s + " --> no match.");
}
});
Solution 3:
This captures every x...x
except the one starting with two "xx" (xx...xx
).
(?:^x{0}|x{2,})(x...x)
Post a Comment for "Match Single Character But Not Multiple"