我试图从字符串中提取数字组。 这些数字既可以单独使用,也可以作为\d+ - \d+
格式的范围,而两个数字之间的范围指示符可以不同,并且数字可以使用前缀M-
或STR
。这些组可以在给定的字符串中出现1到n次,但是如果一个组后面跟着任何不是数字,空格或上面提到的前缀之一的字符,则匹配应该停止,即使后面还可以找到更多的数字。全局正则表达式匹配停止中间字符串
作为一个例子,下面几行
01
05,07
05, 7
M-01, M-12
311,STR 02
M-56
STR 17
01 - Random String 25-31 Random other string
M-04 Random String 01
M-17,3,148,14 to 31
M-17,3,STR 148,14 to 31 - Random String
M-17,3,148,14- 31 Random, String 02 Random, other string
STR 17,3,12 to 18, 148 ,M-14- 31 : Random String 02
应该返回
01
05;07
05;7
01;12
311;02
56
17
01
04
17;3;148;14 to 31
17;3;148;14 to 31
17;3;148;14- 31
17;3;12 to 18;148;14- 31
我使用javascript和运行
var pattern = /(\d+)\s?(?:-|~|to)?\s?(\d+)?/ig
while (result = pattern.exec(line)) {console.log(result)}
,但我几乎可以得到正确的结果不知道如何在第一个字符串后不匹配数字,即M-17,3,148,14 to 31 - Random string 46 Random string
将retu值17;3;148;14 to 31;46
,而46不应该匹配。
我并不是真的担心结果的格式,因为我无论如何正在消毒它们,因此'03 '
返回为'03'
或'03 '
并不重要。对于数字范围也是如此,15 - 17
既可以作为15 - 17
返回,也可以如上例所示,使用捕获组来确定上限和下限,但我仍然需要能够判断两个数字是分开还是范围,所以5,8,10-12
不能作为5;8;10;12
返回。
我的最终目标是提取每行中的所有可能的值。在提取所有数字范围后,我循环遍历每个结果以获得所有可能的值,例如, 5,8,10-12将变成5; 8; 10; 11; 12。
如果它在某种程度上是可能的,而且这纯粹是可选的,我还想在最后一个数字范围后保留字符串,例如, STR 14, 23 Some String 18 Some other string
应返回14;23
并单独返回Some String 18 Some other string
。
如果有人有关于如何解决这个问题的想法,我将不胜感激。
这工作非常好。比我原来的解决方案好得多。非常感谢您的努力! – mmuffins