-2

有一个数组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”、“正则表达式”、;、“如果” :]

4

2 回答 2

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", ":"]

于 2013-03-07T16:22:55.213 回答
1

你可以String#split在你的正则表达式中使用一个捕获组来做到这一点:

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

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

于 2013-03-07T16:51:13.760 回答