2

我想识别一个字符串,例如:

a = 'KI83949 anythingHere 900.00 1 900.00'

字符串由三部分组成:

index part is the string before the first space 
- 'KI83949'

可以是任何东西,而且在大多数情况下,它是字符+数字。

string between a[0] and the first floating number 
with two decimal points is the seconde part
-'anything here'

可以是任何东西

starting with the 2-decimal-point floating number is the last part
-'900.00 1 900.00'

可以是

'900.00' or '900.00 1 1003.00' or '900.00 100.00'
float or float+int+float or float+float 

这里的数字会改变。对于整个字符串,数字部分始终存在,而前两个部分可能不存在。我正在尝试从数千个其他字符串中过滤出具有上述特征的字符串。我尝试了几种方法来表达这一点,但仍然失败。对不起,我的正则表达式知识很差。最接近的镜头如下:

'.*\s?[\d.]+(\s\d)?[\s\d.]+$'

但是,它将返回类似“TS90190”或“80 thda 4318”的内容。在这上面花了几个小时之后,现在它让我发疯了。有人可以帮我吗?

4

1 回答 1

2

.*贪婪的——它会尝试尽可能多地匹配,多于第一个单词,这可能是您发现意外结果的主要原因。首先,您可以通过添加问号来使其不贪心,例如 .*?

但是,更严格的方法是只匹配非空格字符开始:

^[^\s]+

开头的^称为anchor,并断言匹配从字符串的开头(或行,在多行模式下)开始。

让我们看看接下来会发生什么。你想匹配一个浮点数,对吗?听起来我们需要某种非贪婪的量词!

^[^\s]+\s+(.*?)\d+\.\d\d

在某些情况下,上述内容可能会出现问题,目前可能有点过于复杂,无法以您的水平进行解释。但是,如果您知道您的语言或实现支持前瞻断言,那么这将更加健壮:

^[^\s]+\s+(.(?!\d+\.\d\d))+

这样做是匹配每个字符.,只要它后面没有(这就是所谓的否定前瞻断言的部分)一个浮点数。

于 2013-10-24T06:25:51.533 回答