【发布时间】:2009-10-17 14:29:38
【问题描述】:
使用 Ruby... 给出以下字符串:
x = "blah_blah.do.dah[4543]junk_junk"
如何删除最后一个数字/数字之后的所有文本?
我认为最简单的方法可能是找到最后一次出现的索引,然后删除该索引之后的所有内容。但是,我似乎无法弄清楚如何获得该索引。我所有使用正则表达式的尝试都失败了。
【问题讨论】:
使用 Ruby... 给出以下字符串:
x = "blah_blah.do.dah[4543]junk_junk"
如何删除最后一个数字/数字之后的所有文本?
我认为最简单的方法可能是找到最后一次出现的索引,然后删除该索引之后的所有内容。但是,我似乎无法弄清楚如何获得该索引。我所有使用正则表达式的尝试都失败了。
【问题讨论】:
有如何做你需要的答案
还可以找到最后出现的数字:
x = 'blah_blah.do.dah[4543]junk_junk'
x.rindex(/\d/)
【讨论】:
这可能是您正在寻找的正则表达式:
s/\D*$//
此正则表达式匹配字符串末尾的所有非数字,从最后一个数字或字符串的开头(如果它根本不包含任何数字)开始,并删除匹配的任何内容。更准确地说,\D* 是一个 greedy 匹配尽可能多的非数字(零或更多)。 $ 代表字符串的结尾。
在 Ruby 中,您可以使用字符串的 gsub 方法使用正则表达式进行搜索和替换:
x = 'blah_blah.do.dah[4543]junk_junk'
y = x.gsub(/\D*$/, '')
有关正则表达式和 Ruby 的更多信息,请参阅regular-expressions.info。
【讨论】:
总而言之,这似乎是做我需要的最干净、最简单的方法。感谢大家为我指明正确的方向!
index = file.rindex(/\d/)
if(index) then
p file[0 , index+1]
end
【讨论】:
这个正则表达式应该可以工作:
(.*(?=\d)\d)[^\d]*$
你应该使用类似的东西:
result = your_text.gsub(/(.*(?=\d)\d)[^\d]*$/, '\\1')
解释:
(.*(?=\d)\d) 是你要保存的那组东西
.* . 是除了换行符之外的所有内容,* 表示 0 次或多次(?=\d) 表示直到你能够匹配 \d 这是一个数字\d 表示也匹配该数字![^\d]+$ 是你不想保存的部分
[^\d]* 中匹配任何与\d 不匹配的内容,并且* 再次出现0 次或更多次$ 是行尾另一种方法是简单地将[^\d]+$ 替换为空
【讨论】:
我假设你想在数字后面加上最后一个 ']'
这是我的答案:
Original_Text = "blah_blah.do.dah[4543]junk_junk"
Result___Text = Original_Text.gsub(Regexp.new("(.*\\[[0-9]+\\])[^0-9]*$"), '\1')
puts Result___Text
如果没有,试试这个:
Original_Text = "blah_blah.do.dah[4543]junk_junk"
Result___Text = Original_Text.gsub(Regexp.new("(.*[0-9]+)[^0-9]*$"), '\1')
puts Result___Text
【讨论】:
irb(main):068:0> "blah_blah.do.dah[4543]junk_junk".match(/(.+\d)/)[1]
=> "blah_blah.do.dah[4543"
【讨论】:
puts "blah_blah.do.dah[4543]junk_junk"[/.*\d+/]
#returns "blah_blah.do.dah[4543"
使用 rindex:
x = "blah_blah.do.dah[4543]junk_junk"
x.rindex(/\d/)
puts "#{$`}#{$&}"
#also returns "blah_blah.do.dah[4543"
【讨论】: