我希望将字符串中的一组方括号内的最终数字匹配并将其拉出以供其他地方使用
[PROJECT-141] This is the task name
^^ Should get **141**
[PROJECT2-222] Let's be tricky and add an extra number 22
^^ Should get **222**
我有一个非常接近的正则表达式 - 它会获得最终数字。但它也包括比赛中的结束]
。我已经在比赛组中摆弄,但没有快乐。
当它运行时,这将进入Ruby项目。这是我迄今为止最好的:
\[*(\d+)\]
匹配:
141]
222]
答案 0 :(得分:2)
使用String#[]
方法:
如果提供了Regexp,则返回字符串的匹配部分。如果捕获遵循正则表达式(可能是捕获组索引或名称),则遵循正则表达式,而不是返回MatchData的组件。
'[PROJECT2-222]'[/\[.*-(\d+)\]/,1] # => "222"
'[PROJECT-141]'[/\[.*-(\d+)\]/,1] # => "141"
答案 1 :(得分:1)
我会用:
project_ids = [
"[PROJECT-141] This is the task name",
"[PROJECT2-222] Let's be tricky and add an extra number 22",
].map { |s|
s[/-(\d+)\]/, 1]
}
project_ids # => ["141", "222"]
这是正则表达式设计的任务。 \d
是一个数字,0..9。 \d+
是一个或多个数字。我们需要一些占位符来确定要搜索的字符串中的位置,因此使用数字前面的-
和后面的]
对于给出的示例就足够了。
魔术发生在map
区块,使用s[/-(\d+)\]/, 1]
,这是一种简单的说法:
(\d+)
告诉引擎记住该模式的一部分,然后使用1
参数返回该模式。它是String#[]
的所有部分。答案 2 :(得分:0)
试试这个正则表达式:/\[.*-(\d+)\]/
以下是{strong>上面的正则表达式的pry
内的控制台试用版:
[1] pry(main)> str = "[PROJECT-141] This is the task name"
# => "[PROJECT-141] This is the task name"
[2] pry(main)> match = str.match(/\[.*-(\d+)\]/)
#=> #<MatchData "[PROJECT-141]" 1:"141">
[3] pry(main)> match[1]
#=> 141
另外,你的正则表达式也是正确的。唯一的区别是它匹配141]
,但第一个匹配,即match[1]
将为您提供所需的整数,即141
。
以下是你的正则表达式中pry
内的控制台试用版:
[4] pry(main)> str = "[PROJECT-141] This is the task name"
# => "[PROJECT-141] This is the task name"
[5] pry(main)> match = str.match(/\[*(\d+)\]/)
#=> #<MatchData "141]" 1:"141">
[6] pry(main)> match[1]
#=> 141
以下是您可以使用上述功能创建的快速功能:
# will output 0, if it could not find a match for the project's id
def extract_project_ids(*args)
args.map { |task| task.match(/\[.*-(\d+)\]/)[1] rescue 0 }
end
task1 = "[PROJECT-141] This is the task name"
task2 = "[PROJECT2-222] Let's be tricky and add an extra number 22"
extract_project_ids(task1, task2)
# => [ 141, 222 ]