(Ruby)使用正则表达式解析字符串

(Ruby)使用正则表达式解析字符串,ruby,regex,Ruby,Regex,这是我要分析的字符串: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+) 我的价值观是

这是我要分析的字符串:
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' 

列表[1]
值已关闭。我可能也没有正确解析空格,但我在《鹤嘴锄》一书或网上找不到任何指导

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

([a-zA-Z0-9]*\s{1})+
括号中的组重复,分别匹配单词
'SOME'
'TEXT'
'HERE'
,剩下的第二个捕获组只有最后一个匹配项
'HERE'

您需要将
+
放在捕获括号内的组中,并使用非捕获括号
(?:…)
将现有组括起来。非捕获圆括号是正则表达式中的一种方法,它使用
(?:
启动组,使用
结束组,将比赛的部分分组在一起,而不捕获组。您可以对非捕获组使用重复运算符(
+
*
{n}
{n,m}
),然后捕获整个表达式:

((?:[a-zA-Z0-9]*\s{1})+)
/^\d [a-z]{3} \d\d ([a-z]{3} \d\d) ((?:\w* )+)(\d+.\d+)/i
总计:

/^\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
选项并简化字母字符类。这是一个更为惯用的正则表达式:

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

最后,尽管Ruby正则表达式文档有点单薄,但是Ruby使用了一些标准的与Perl兼容的正则表达式,您可以在

上找到关于正则表达式的更多信息。您的问题在第二个捕获组中:

([a-zA-Z0-9]*\s{1})+
括号中的组重复,分别匹配单词
'SOME'
'TEXT'
'HERE'
,剩下的第二个捕获组只有最后一个匹配项
'HERE'

您需要将
+
放在捕获括号内的组中,并使用非捕获括号
(?:…)
将现有组括起来。非捕获圆括号是正则表达式中的一种方法,它使用
(?:
启动组,使用
结束组,将比赛的部分分组在一起,而不捕获组。您可以对非捕获组使用重复运算符(
+
*
{n}
{n,m}
),然后捕获整个表达式:

((?:[a-zA-Z0-9]*\s{1})+)
/^\d [a-z]{3} \d\d ([a-z]{3} \d\d) ((?:\w* )+)(\d+.\d+)/i
总计:

/^\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
选项并简化字母字符类。这是一个更为惯用的正则表达式:

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

最后,尽管Ruby正则表达式文档有点薄,但是Ruby使用了一些标准的与Perl兼容的正则表达式,您可以在

上找到关于正则表达式的更多信息。您可能也在这里尝试过这个工具,但我强烈推荐。它提供了非常快速的字符串解析


看起来你已经得到了你问题的具体答案,所以我只是想把这个给其他路过的人,让他们知道去哪里测试他们的正则表达式或者只是练习一下

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


看起来你已经得到了你问题的具体答案,所以我只是想把这个给其他路过的人,让他们知道去哪里测试他们的正则表达式或者只是练习一下

代码工作得很好,但是你能解释一下这意味着什么吗?并使用非捕获括号(?:…)将现有组括起来:“代码工作得很好,但您能解释一下这意味着什么吗?”?并使用非捕获括号(?:…)将您现有的组括起来:“这更适合作为一个评论,而不是一个答案。事实上,现在我想起来了。仍在学习堆栈溢出的诀窍。这本应该更适合作为一个评论,而不是一个答案。事实上,现在我想起来了。仍在学习堆栈溢出的诀窍。