javascript正则表达式在匹配前检查字符但不包含在结果

时间:2018-03-13 16:46:06

标签: javascript regex

我正在尝试在单个正则表达式中实现以下两个规则:

如果数字前面是:

  • 单词字符或@字符;然后不匹配任何东西
  • 其他任何事情;然后在结果
  • 中匹配数字但不包括前面的字符

我尝试过:[^@\d,\w]\d+(?:[^@\d,\w])\d+

解决了第一条规则,但未能解决第二条规则,因为它在结果中包含了运算符。

我理解为什么它不按预期工作; [^@\d\w]部分明确表示不匹配@或字符前面的数字,因此它隐含地表示在结果中包含任何其他内容。问题是我仍然不知道如何解决这个问题。

有没有办法在单个正则表达式中实现这两个规则?

输入字符串:

@121 //do not match
+39  //match but don't include the + sign in result
s21  //do not match
89   //match
(98  //match but don't include the ( in result
/4   //match but don't include the / operator in result

预期结果:

39 //operator removed
89  
98 //( removed
4  //operator removed

2 个答案:

答案 0 :(得分:2)

捕获您正在寻找的结果,如下面的代码段所示。

See regex in use here

 <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <RuntimeFrameworkVersion>2.0.5</RuntimeFrameworkVersion>
    <IsServiceFabricServiceProject>True</IsServiceFabricServiceProject>
 </PropertyGroup>
  • ^[^@\w]?(\d+) 在行首处断言位置
  • ^可选择匹配除[^@\w]?或字符
  • 之外的任何字符
  • @将一个或多个数字捕获到捕获组1

(\d+)

答案 1 :(得分:1)

a finished proposal的负面观察,我认为这就是你要找的东西:

let arr =
['@121', //do not match
'+39', //match but don't include the + sign in result
's21',  //do not match
'89',   //match
'(98',  //match but don't include the ( in result
'/4'   //match but don't include the / operator in result
];

console.log(arr.map(v => v.match(/(?<![@\w])\d+/)));

然而,这是一个前沿的特征(我认为在62+铬上工作)。