使用正则表达式从字符串中获取3个组

时间:2015-03-29 03:58:29

标签: ruby regex

这是我的预期结果。

输入一个字符串并获得三个返回的字符串。

我不知道如何在Ruby中使用Regex完成它。

这是我的大致想法。

match(/(.*?)(_)(.*?)(\d+)/)

输入和预期输出

# "R224_OO2003" => R224, OO, 2003
# "R2241_OOP2003" => R2244, OOP, 2003

3 个答案:

答案 0 :(得分:1)

如果我在评论中给出的示例说明是正确的,那么您需要一个非常简单的正则表达式:

r = /(.+)_(.+)(\d{4})/

然后:

"R224_OO2003".scan(r).flatten   #=> ["R224",   "OO", "2003"]  
"R2241_OOP2003".scan(r).flatten #=> ["R2241", "OOP", "2003"]

答案 1 :(得分:0)

只要您的模式涵盖所有可能性,那么您只需要使用匹配对象返回3个字符串:

my_match = "R224_OO2003".match(/(.*?)(_)(.*?)(\d+)/)
    #=>  #<MatchData "R224_OO2003" 1:"R224" 2:"_" 3:"OO" 4:"2003">
puts my_match[0] #=> "R224_OO2003"
puts my_match[1] #=> "R224"
puts my_match[2] #=> "_"
puts my_match[3] #=> "00"
puts my_match[4] #=> "2003"

MatchData对象包含从index [1]开始的每个匹配组的数组。如您所见,index [0]返回整个字符串。如果你不想捕获&#34; _&#34;你可以把它括起来。

另外,我不确定你是否得到了你想要的部分:

(。*?)

这基本上表示任何单个字符中的一个或多个后跟零或任何单个字符之一。

答案 2 :(得分:0)

假设你的三个部分由(R和一个或多个数字),然后是一个下划线,然后(一个或多个非空白字符),最后(一个4位数字日期),那么你的正则表达式可能是像这样的东西:

^(R\d+)_(\S+)(\d{4})$

^表示字符串的开头,$表示字符串的结尾。 \ d +表示一个或多个数字,而\ S +表示一个或多个非空白字符。 \ d {4}恰好说四位数。

要从匹配中恢复数据,您可以使用与您的组对齐的预定义全局变量,也可以使用命名捕获。

要使用匹配全局变量,只需使用$ 1,$ 2和$ 3。通常,您可以通过计算特定组的左括号来计算要使用的数字。

要使用指定的捕获,包括?在特定群体的左派之后。例如:

x = "R2241_OOP2003"
match_data = /^(?<first>R\d+)_(?<second>\S+)(?<third>\d{4})$/.match(x)
puts match_data['first'], match_data['second'], match_data['third']

产量

R2241
OOP
2003

正如所料。