所以,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中有效的正则表达式。
有人可以帮忙吗?
答案 0 :(得分:1)
我不知道你为什么要匹配分隔连字符,而不是只匹配整个字符串并捕获数字:
input.match(/(-?\d+) *- *(-?\d+)/)
2个数字将在捕获第1组和第2组。
可以使用\b
来检查{{1},编写适用于清理输入的正则表达式(无空格,并保证有效,如问题中所示)前面有一个单词字符:
-
由于已清理字符串中的唯一单词字符为\b-
,因此我们有效地检查0-9
前面是数字。
答案 1 :(得分:0)
(\d+.*?)(?:\s+(-)\s+)(.*?\d+)
你可能想要这个,虽然我不知道为什么2nd
和4th
的预期输出之间存在差异。可能是一个错字。你可以尝试用$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);