0

这是我要解析的字符串:2 Sep 27 Sep 28 SOME TEXT HERE 35.00

我想将它解析成一个列表,使值看起来像:

list[0] = 'Sep 28'
list[1] = 'SOME TEXT HERE'
list[2] = '35.00'

我一直在研究的正则表达式:

^\d{1}\s{1}[a-zA-Z]{3}\s{1}\d{2}\s{1}([a-zA-Z]{3}\s{1}\d{2})\s{1}([a-zA-Z0-9]*\s{1})+(\d+.\d+)

我的价值观是:

list[0] = 'Sep 28'
list[1] = 'HERE'
list[2] = '35.00' 

list[1]值已关闭。我也可能没有正确解析空格,但我在“Pickaxe”一书或网上找不到任何指导。

4

2 回答 2

4

您的问题出在您的第二个捕获组中:

([a-zA-Z0-9]*\s{1})+

重复括号中的组,匹配每个单词'SOME','TEXT''HERE'单独,使您的第二个捕获组仅与最终匹配项 , 匹配'HERE'

您需要将捕获括号组放在+ 内部,并使用非捕获括号(?:...)将现有组括起来。(?:用于开始组和结束组的非捕获括号)是正则表达式中将匹配部分组合在一起而不捕获组的一种方式。您可以在非捕获组上使用重复运算符(+*{n}或),然后捕获整个表达式:{n,m}

((?:[a-zA-Z0-9]*\s{1})+)

总共:

/^\d{1}\s{1}[a-zA-Z]{3}\s{1}\d{2}\s{1}([a-zA-Z]{3}\s{1}\d{2})\s{1}((?:[a-zA-Z0-9]*\s{1})+)(\d+.\d+)/

作为旁注,这是一个非常笨重的正则表达式。您永远不需要{1}在正则表达式中指定,因为单个匹配是默认设置。类似地,比\d\d一个字符。此外,您可能只想要而不是. 由于您似乎不关心大小写,您可能只想使用该选项并简化字母字符类。像这样的东西是一个更惯用的正则表达式:\d{2}\w[a-zA-Z0-9]/i

/^\d [a-z]{3} \d\d ([a-z]{3} \d\d) ((?:\w* )+)(\d+.\d+)/i

最后,虽然正则表达式的 Ruby 文档有点薄,但 Ruby 使用了一些标准的 Perl 兼容正则表达式,您可以在regular-expressions.info找到更多关于正则表达式的信息

于 2012-08-26T17:45:39.593 回答
1

你可能也来过这里并尝试过这个工具,但我强烈推荐Rubular。它提供了非常快速的字符串解析。

看起来你已经得到了问题的具体答案,所以我只是想把这个放到其他人那里,这样他们就可以知道去哪里测试他们的正则表达式或只是练习。

于 2012-08-26T19:39:03.763 回答