正则表达式(.NET)-无法识别的分组结构

时间:2018-07-06 14:01:00

标签: regex vb.net

我为使以下正则表达式正常工作(VB.NET)而感到困惑

输入:

const arr1 = [27, 54, 67, 11, 15, 22, 26, 58, 45, 87];
let arr2 = [];

function getRandom(){
  var randomNumber = arr1[Math.floor(Math.random()*arr1.length)];
  while(arr2.indexOf(randomNumber) !== -1 && arr2.length !== arr1.length) {
    randomNumber = arr1[Math.floor(Math.random()*arr1.length)];
  }
  arr2.push(randomNumber);
}
getRandom(); getRandom(); getRandom(); getRandom(); getRandom(); getRandom(); getRandom(); getRandom(); getRandom(); getRandom();getRandom();
console.log(arr2);

预期输出:

 +1.41 DS +0.93 DC x 3* @12.5 mm (4.00 Rx Calc)

我已经得到以下表达式:

 +0.93

这将返回结果

 DS[ \t]*[+\-][ \t]*\d{1,2}\.\d{2}

当我将正则表达式修改为时,我只需要返回+0.93(没有任何前导空格):

DS +0.93

我得到了无法识别的错误分组结构,我不明白为什么它会给我这个错误。我认为我的不匹配小组不正确,但是我找不到原因/位置?

1 个答案:

答案 0 :(得分:1)

您可以在此处使用积极的表情:

(?<=DS[ \t]*)[+-][\t ]*\d{1,2}\.\d{2}
 ^^^

请参见regex demo

要确保将数字和DS匹配为整个单词(前后没有字母,数字或_),请使用单词边界:

(?<=\bDS[ \t]*)[+-][\t ]*\d{1,2}\.\d{2}\b

或者在(?!\d)之后出现\d{2}否定查找:

(?<=\bDS[ \t]*)[+-][\t ]*\d{1,2}\.\d{2}(?!\d)

请参见another regex demo

详细信息

  • (?<=\bDS[ \t]*)-向后的正向匹配,它与字符串中的位置相匹配,该位置紧随其后的是整个单词DS,后跟0+空格或制表符
  • [+-]-一个+-
  • [\t ]*-0多个空格或制表符
  • \d{1,2}-1或2位数字
  • \.-一个点
  • \d{2}-2位数字
  • (?!\d)-当前位置右边不允许有数字。

VB.NET demo

Dim my_rx As Regex = New Regex("(?<=\bDS[ \t]*)[+-][\t ]*\d{1,2}\.\d{2}(?!\d)")
Dim my_result As Match = my_rx.Match(" +1.41 DS +0.93 DC x 3* @12.5 mm (4.00 Rx Calc)")
If my_result.Success Then
    Console.WriteLine(my_result.Value) ' => +0.93
End If