2012-08-26 76 views
0

一个字符串,这是我想要解析字符串:2 Sep 27 Sep 28 SOME TEXT HERE 35.00(Ruby)的解析与正则表达式

我想将它解析为一个列表中,这样的价值观是这样的:

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

你的问题是你的第二个捕获组:

([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

+0

该代码完美工作,但请您解释这是什么意思? “并使用非捕获括号(?:...)来包围您的现有组:” – tsurantino

1

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

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

+0

这将更适合作为评论,而不是答案。 –

+0

确实如此,现在我想到了。仍在学习堆栈溢出的思路。 – Matt