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"