正则表达式排除结束括号

时间:2014-01-03 21:16:31

标签: ruby regex

我希望将字符串中的一组方括号内的最终数字匹配并将其拉出以供其他地方使用

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

3 个答案:

答案 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],这是一种简单的说法:

  1. 在字符串中查找与模式匹配的内容。
  2. 捕获组(\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

可能是一个功能? :P

以下是您可以使用上述功能创建的快速功能:

# 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 ]