将数组项的特殊最后一个字符串插入到单独的数组项中

时间:2013-03-07 16:07:15

标签: ruby-on-rails ruby regex

有一个数组test_array,其中包含一个.split(' ')的字符串拆分。因此,每个项目的最后一个字符可以是'.''-''!'以及任何其他非字类型。 目标是将此字符作为源的单独项插入到数组中,并从其源中删除此字符。

l=0
test_array= @test.source.split(' ') 
test_array. each do |f| 
    if f[-1]== /[^\w]/
        test_array.insert(l+1, f[-1]) 
        f=f.chop 
        l+=1 
    else 
        l+=1 
    end 
end

/[^\w]/是任何非单词字符的正则表达式 由于某种原因,它不起作用。试图调试一个小时,没有解决方案。

UPD 例如,输入为:

[“”“模式”,“是”,“通常”,“a”,“正则表达式;”,“如果: ]

输出应为:

[“”“模式”,“是”,“通常”,“a”,“正则表达式”;”,“如果“:]

2 个答案:

答案 0 :(得分:1)

对于Regexp,您需要使用=~运算符或match方法,因此您的代码将变为:

(编辑 - 考虑一下,你会得到一个无休止的循环,因为你在完成迭代之前在数组的末尾插入了非单词字符,所以你将解析那个项目你刚刚插入,这恰好总是一个非单词字符..所以你会把它砍掉然后插回来......等等。为了解决这个问题,你应该建立一个新的数组,我已经更新了我的以下答案反映了这一点。)

test_array= @test.source.split(' ') 
result_array=[]
test_array.each do |f| 
    if f[-1]=~ /[^\w]/
        result_array << f.chop << f[-1]
    else
        result_array << f
    end
end

测试:

1.9.3p194 :041 > test_array = ["The" "pattern", "is", "typically", "a", "Regexp;", "if:" ]
 => ["Thepattern", "is", "typically", "a", "Regexp;", "if:"] 
1.9.3p194 :042 > result_array = []
 => [] 
1.9.3p194 :043 > test_array.each{|f| if f[-1]=~ /[^\w]/; result_array << f.chop; result_array << f[-1]; else; result_array << f; end}
 => ["Thepattern", "is", "typically", "a", "Regexp;", "if:"] 
1.9.3p194 :044 > result_array
 => ["Thepattern", "is", "typically", "a", "Regexp", ";", "if", ":"]

sauce

答案 1 :(得分:1)

您可以使用正则表达式中的捕获组使用单个String#split执行此操作:

pry(main)> "The pattern is typically a Regexp; if:".split(/([^\w\s])?(?:\s+|$)/)
=> ["The", "pattern", "is", "typically", "a", "Regexp", ";", "if", ":"]

当拆分正则表达式包含捕获组时,它们也会在结果中返回。这个正则表达式在空格上分割,在空格之前捕获一个可选的非单词/非空白字符。