Javascript积极的lookbehind替代品

时间:2014-12-03 06:59:12

标签: javascript regex

所以,js显然不支持lookbehind。

我想要的是在javascript中有效的正则表达式,可以模仿这种行为。

具体来说,我有一个由数字和连字符组成的字符串来表示范围。如,

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

请忽略空格。当然,这是唯一可能的情况,数量不同。 我想要的是匹配分隔数字的第一个连字符,而不是减号。换句话说,第一个连字符后跟一个数字。但这个数字不应该成为比赛的一部分。

所以我的字符串是:

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

并且匹配应该是前2个案例中的第3个字符和后两个中的第4个字符。

我需要的单个正则表达式与括号中的字符匹配。

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

这可以通过积极的观察来实现:

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

但是javascript并不支持。我想要一个基本上做同样的事情并且在js中有效的正则表达式。

有人可以帮忙吗?

2 个答案:

答案 0 :(得分:1)

我不知道你为什么要匹配分隔连字符,而不是只匹配整个字符串并捕获数字:

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

2个数字将在捕获第1组和第2组。

可以使用\b来检查{{1},编写适用于清理输入的正则​​表达式(无空格,并保证有效,如问题中所示)前面有一个单词字符:

-

由于已清理字符串中的唯一单词字符为\b- ,因此我们有效地检查0-9前面是数字。

答案 1 :(得分:0)

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

你可能想要这个,虽然我不知道为什么2nd4th的预期输出之间存在差异。可能是一个错字。你可以尝试用$1$2$3代替。演示。

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);