有一个数组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”,“正则表达式”,“;
”,“如果“,”:
“]
答案 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", ":"]
答案 1 :(得分:1)
您可以使用正则表达式中的捕获组使用单个String#split
执行此操作:
pry(main)> "The pattern is typically a Regexp; if:".split(/([^\w\s])?(?:\s+|$)/)
=> ["The", "pattern", "is", "typically", "a", "Regexp", ";", "if", ":"]
当拆分正则表达式包含捕获组时,它们也会在结果中返回。这个正则表达式在空格上分割,在空格之前捕获一个可选的非单词/非空白字符。