I am trying to create a regex to match more than one occurrence of ; between two words (more than one letter).
Ex
MM ZZ ; ; ; ; NN GGG ; ; SSS. ;
I need to replace ; ; ; ; and ; ; with ; so I would have
MM ZZ;NN GGG;SS. ;
If my string looks like ZZ ; ; ; ; NN. ; I managed to get (?<=[a-zA-z])\b(.*)(?=[a-zA-z])\b which works
But if my string is more complicated like MM ZZ ; ; ; ; NN GGG ; ; SSS. ; then it does not work
How to do this?
CodePudding user response:
You might use:
(?<=[a-zA-Z])\s*;\s;[\s;]*(?=[a-zA-Z])
Explanation
(?<=[a-zA-Z])Positive lookbehind, assert a char a-zA-Z to the left\s*;\s;Match at least 2 times;between optional whitespace chars[\s;]*Match optional whitespace chars or;chars(?=[a-zA-Z])Positive lookahead, assert a char a-zA-Z to the right
And replace with a single ;
const regex = /(?<=[a-zA-Z])\s*;\s;[\s;]*(?=[a-zA-Z])/g;
const s = `MM ZZ ; ; ; ; NN GGG ; ; SSS. ;
ZZ ; ; ; ; NN. ;
MM ZZ ; ; ; ; NN GGG ; ; SSS. ;`;
console.log(s.replace(regex, ';'))
If the single semicolons should be separated by at least a single whitespace char:
(?<=[a-zA-Z])\s (?:;\s ) (?=[a-zA-Z])
In this pattern, this part \s (?:;\s ) matches 1 whitespace chars, and repeats 1 times ; and 1 whitespace chars.
