這看起來像是你要追求這種艱難的方式。我懷疑示例字符串並不像你說的那樣簡單,基於:
我有一個字符串,它具有可變長度的部分。該部分的長度在該部分的內容之前。
相反,我會使用類似:
str = "13JOHNSON,STEVE 08Blow,Joe 10Smith,John"
str.scan(/\d{2}(\S+)/).flatten # => ["JOHNSON,STEVE", "Blow,Joe", "Smith,John"]
如果字符串可以準確地分割,再有就是這個:
str.split.map{ |s| s[2..-1] } # => ["JOHNSON,STEVE", "Blow,Joe", "Smith,John"]
如果你只有後面的字符串長度的字節,他們之間沒有任何東西像這樣工作:
offset = 0
str.delete!(' ') # => "13JOHNSON,STEVE08Blow,Joe10Smith,John"
str.scan(/\d+/).map{ |l| s = str[offset + 2, l.to_i]; offset += 2 + l.to_i ; s }
# => ["JOHNSON,STEVE", "Blow,Joe", "Smith,John"]
如果名字在他們的數字
將無法正常工作 - tihom
str = "13JOHNSON,STEVE 08Blow,Joe 10Smith,John 1,7890"
str.scan(/\d{2}(\S+)/).flatten # => ["JOHNSON,STEVE", "Blow,Joe", "Smith,John", "12345,7890"]
str.split.map{ |s| s[2..-1] } # => ["JOHNSON,STEVE", "Blow,Joe", "Smith,John", "12345,7890"]
使用AA微小的變化,和次要此外,它會繼續與不包含分隔符的字符串正常工作:
str.delete!(' ') # => "13JOHNSON,STEVE08Blow,Joe10Smith,John1,7890"
offset = 0
str.scan(/\d{2}/).map{ |l| s = str[offset + 2, l.to_i]; offset += 2 + l.to_i ; s }.compact
# => ["JOHNSON,STEVE", "Blow,Joe", "Smith,John", "12345,7890"]
\d{2}
以兩組一組的方式抓取數字。對於數字是根據OP樣本的兩個字符的前導長度值的名稱,會發生正確的事情。對於一個固定的數字「名稱」,會返回幾個誤報,這將返回nil
值。 compact
清理掉了。
爲什麼不顯示一個更完整的字符串示例?這聽起來像你已經決定一個模式是正確的方法來解決這個問題,但基於這個例子,我會做很多不同的事情。正則表達式有它們的位置,但它們不是通用錘子。 –