Jonathan Lam
Jonathan Lam

Reputation: 17351

Regex Error: Nothing to Repeat

I'm new to regular expressions in JavaScript, and I cannot get a regex to work. The error is:

Uncaught SyntaxError: Invalid regular expression: /(.*+x.*+)\=(.++)/: Nothing to repeat

I know there are many questions like this other than this, but I cannot get this to work based on other people's answers and suggestions.

The regex is:

/(.*+x.*+)\=(.++)/

and it is used to match simple equations with the variable x on one side.

Some examples of the expressions it's supposed to match are (I'm writing a simple program to solve for the variable x):

I'm trying out possessive quantifiers (*+) because before, the expressions were greedy and crashed my browser, but now this error that I haven't encountered has come up.

I'm sure it doesn't have to do with escaping, which was the problem for many other people.

Upvotes: 1

Views: 3867

Answers (3)

Casimir et Hippolyte
Casimir et Hippolyte

Reputation: 89557

You can emulate a possessive quantifier with javascript (since you can emulate an atomic group that is the same thing):

a++ => (?>a+) => (?=(a+))\1

The trick use the fact that the content of a lookahead assertion (?=...) becomes atomic once the closing parenthesis reached by the regex engine. If you put a capturing group inside (with what you want to be atomic or possessive), you only need to add a backreference \1 to the capture group after.

About your pattern:

.*+x is an always false assertion (like .*+=): since .* is greedy, it will match all possible characters, if you make it possessive .*+, the regex engine can not backtrack to match the "x" after.

What you can do:

Instead of using the vague .*, I suggest to describe more explicitly what can contain each capture group. I don't think you need possessive quantifiers for this task.

Trying to split the string on operator can be a good idea too, and avoids to build too complex patterns.

Upvotes: 4

CMPS
CMPS

Reputation: 7769

Try this, it will seperate the left hand side and the right hand side:

(.*x.*)=(.+)

Live demo

Upvotes: 0

Robby Cornelissen
Robby Cornelissen

Reputation: 97130

Javascript regular expressions don't support possessive quantifiers. You should try with the reluctant (non-greedy) ones: *? or +?

Upvotes: 1

Related Questions