2013-09-30 38 views
0

我有一個字符串具有可變長度部分。該部分的長度在該部分的內容之前。例如,在字符串中:在正則表達式中使用regex反向引用值作爲數值

13JOHNSON,STEVE 

前2個字符定義了內容的長度(13),後面跟着實際的內容。我希望能夠使用具有反向引用的命名捕獲組來解析此問題,但我不確定這是可能的。我希望這會工作:

(?<length>\d{2})(?<name>.{\k<length>}) 

但它沒有。似乎反向引用不被解釋爲數字。這工作正常,但:

(?<length>\d{2})(?<name>.{13}) 
+0

爲什麼不顯示一個更完整的字符串示例?這聽起來像你已經決定一個模式是正確的方法來解決這個問題,但基於這個例子,我會做很多不同的事情。正則表達式有它們的位置,但它們不是通用錘子。 –

回答

2

不,當然不會工作。您需要在提取第一個數字後重新編譯您的正則表達式。

我建議你使用兩個不同的表達式: 第一個提取數字,第二個提取基於第一個提取的數字的文本。

0

這是怎麼回事?

a = '13JOHNSON,STEVE' 

puts a.match /(?<length>\d{2})(?<name>(.*),(.*))/ 
1

你不能那樣做。

>> s = '13JOHNSON,STEVE' 
=> "13JOHNSON,STEVE" 
>> length = s[/^\d{2}/].to_i # s[0,2].to_i 
=> 13 
>> s[2,length] 
=> "JOHNSON,STEVE" 
+0

這就是答案。使用正則表達式來提取數字,然後你不再需要一個正則表達式。 –

+0

這可以簡化爲'[/ ^(\ d {2})/]; s [2,$ 1.to_i]#=>「JOHNSON,STEVE」'如果在長度字符前面有任何字符,或者字符串中有多個長度+名稱組合,就會中斷,如OP所述。 –

1

這看起來像是你要追求這種艱難的方式。我懷疑示例字符串並不像你說的那樣簡單,基於:

我有一個字符串,它具有可變長度的部分。該部分的長度在該部分的內容之前。

相反,我會使用類似:

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清理掉了。

+0

將不起作用,如果名稱中有數字 – tihom

+0

感謝您的答覆錫文,你是正確的,字符串比我用作例子的片段更復雜。我只是想知道在我回退到更傳統的方法之前,這樣的事情是否可以用正則表達式。 –

相關問題