Snowman
Snowman

Reputation: 2495

Javascript positive lookbehind alternative

So, js apparantly doesn't support lookbehind.

What I want is a regex valid in javascript that could mimic that behavior.

Specifically, I have a string that consists of numbers and hyphens to denote a range. As in,

12 - 23
12 - -23
-12 - 23
-12 - -23

Please ignore the spaces. These are the only cases possible, with different numbers, of course. What I want is to match the first hyphen that separates the numbers and is not a minus sign. In other words, the first hyphen followed by a digit. But the digit shouldn't be part of the match.

So my strings are:

12-23
12--23
-12-23
-12--23

And the match should be the 3rd character in the 1st 2 cases and the 4th character in the last two.

The single regex I need is expected to match the character in brackets.

12(-)23
12(-)-23
-12(-)23
-12(-)-23

This can be achieved using positive lookbehind :

(?<=[0-9])\- 

But javascript doesn't support that. I want a regex that essentially does the same thing and is valid in js.

Can anyone help?

Upvotes: 0

Views: 880

Answers (2)

nhahtdh
nhahtdh

Reputation: 56829

I don't know why you want to match the delimiting hyphen, instead of just matching the whole string and capture the numbers:

input.match(/(-?\d+) *- *(-?\d+)/)

The 2 numbers will be in capturing group 1 and 2.

It is possible to write a regex which works for sanitized input (no space, and guaranteed to be valid as shown in the question) by using \b to check that - is preceded by a word character:

\b-

Since the only word characters in the sanitized string is 0-9, we are effectively checking that - is preceded by a digit.

Upvotes: 1

vks
vks

Reputation: 67988

(\d+.*?)(?:\s+(-)\s+)(.*?\d+)

You probably want this though i dont know why there is a diff between expected output of 2nd and 4th.Probably its a typo.You can try this replace by $1$2$3.See demo.

http://regex101.com/r/yR3mM3/26

var re = /(\d+.*?)(?:\s+(-)\s+)(.*?\d+)/gmi;
var str = '12 - 23\n12 - -23\n-12 - 23\n-12 - -23';
var subst = '$1$2$3';

var result = str.replace(re, subst);

Upvotes: 0

Related Questions