(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兼容的正则表达式,您可以在上找到关于正则表达式的更多信息。您可能也在这里尝试过这个工具,但我强烈推荐。它提供了非常快速的字符串解析
看起来你已经得到了你问题的具体答案,所以我只是想把这个给其他路过的人,让他们知道去哪里测试他们的正则表达式或者只是练习一下 您可能也在这里尝试过这个工具,但我强烈推荐您。它提供了非常快速的字符串解析
看起来你已经得到了你问题的具体答案,所以我只是想把这个给其他路过的人,让他们知道去哪里测试他们的正则表达式或者只是练习一下 代码工作得很好,但是你能解释一下这意味着什么吗?并使用非捕获括号(?:…)将现有组括起来:“代码工作得很好,但您能解释一下这意味着什么吗?”?并使用非捕获括号(?:…)将您现有的组括起来:“这更适合作为一个评论,而不是一个答案。事实上,现在我想起来了。仍在学习堆栈溢出的诀窍。这本应该更适合作为一个评论,而不是一个答案。事实上,现在我想起来了。仍在学习堆栈溢出的诀窍。