2014-11-01 18 views
0

我有這樣的文字,我需要提取所有的羅盤(這是由|:|表示,...等)如何捕捉角色併爲下一場比賽「重複」?

X:1 
T:Paddy O'Rafferty 
C:Trad. 
M:6/8 
K:D 
dff cee|def gfe|dff cee|dfe dBA|dff cee|def gfe|faf gfe|1 dfe dBA:|2 dfe dcB|] 
~A3 B3|gfe fdB|AFA B2c|dfe dcB|~A3 ~B3|efe efg|faf gfe|1 dfe dcB:|2 dfe dBA|] 
fAA eAA|def gfe|fAA eAA|dfe dBA|fAA eAA|def gfe|faf gfe|dfe dBA:| 

現在我有以下的正則表達式:

/([\|\[].+?[\|\]])/m 

其中每一個指南針都可以工作,因爲[\|\]]該標記「消耗」了該字符。

我想捕捉羅盤以這種方式:

|def gfe| 
|dff cee| 
|dfe dBA| 
|dff cee| 
|def gfe| 
|faf gfe| 
|1 dfe dBA:| 
|2 dfe dcB|] 
+0

http://ruby-doc.org/core-1.8.7/String.html這裏是RUBY – Eda 2014-11-01 20:27:27

+0

類似的操作由於的描述|在這種情況下角色只能作爲視覺和語法分隔符,你並不需要捕獲它,是嗎?您可以捕捉集合{'def gfe','dff cee','dfe dBA',(...),'1 dfe dBA:','2 dfe dcB'|}並假設條形碼字符。 (好調,順便說一句) – 2014-11-01 20:30:45

+0

的事情是|分隔符可以與其他字符捆綁(例如:[|,||,| :,:|,...等),所以我需要捕獲它們。 – 2014-11-01 20:48:01

回答

0

使用String#scan返回所有匹配的Array

如:

text = 'your long text up there' 
text.scan(/([\|\[].+?[\|\]])/m) 

以上的回報:

[["|def gfe|"], ["|dfe dBA|"], ["|def gfe|"], ["|1 dfe dBA:|"], ["|]\n~A3 B3|"], ]...], [...]] 

希望這有助於

+0

在第一行中,它會返回'「| dff cee |」的任一實例' 或'| 2 dfe dcB |]'。我沒有檢查其他兩行 – 2014-11-01 21:48:44

+0

-1,不是因爲答案錯誤,因爲你讓它知道它錯了。 – 2014-11-02 19:40:30

0

這裏有一對夫婦,你能做到這一點的方式。

#1在每一行上使用String#split,然後修復行的末尾。

def split_em(str) 
    arr = str.split(?|).map { |s| "|#{s}|" } 
    arr[-1] << (arr.pop).tr(?|,'') unless str[-1] == ?| 
    arr 
end 

split_em("dff cee|def gfe|dff cee|dfe dBA|dff cee|def gfe|faf gfe|1 dfe dBA:|2 dfe dcB|]") 
    #=> ["|dff cee|", "|def gfe|", "|dff cee|", "|dfe dBA|", "|dff cee|", 
    # "|def gfe|", "|faf gfe|", "|1 dfe dBA:|", "|2 dfe dcB|]"] 
split_em("~A3 B3|gfe fdB|AFA B2c|dfe dcB|~A3 ~B3|efe efg|faf gfe|1 dfe dcB:|2 dfe dBA|]") 
    #=> ["|~A3 B3|", "|gfe fdB|", "|AFA B2c|", "|dfe dcB|", "|~A3 ~B3|", 
    # "|efe efg|", "|faf gfe|", "|1 dfe dcB:|", "|2 dfe dBA|]"] 
split_em("fAA eAA|def gfe|fAA eAA|dfe dBA|fAA eAA|def gfe|faf gfe|dfe dBA:|") 
    #=> ["|fAA eAA|", "|def gfe|", "|fAA eAA|", "|dfe dBA|", 
    # "|fAA eAA|", "|def gfe|", "|faf gfe|", "|dfe dBA:|"] 

#2應用正則表達式的每一行創建一個數組,然後修改數組

def split_em(str) 
    str.scan(/(?<=^|\|).+?\|(?:[^|]*?$)?/).map { |s| "|#{s}" } 
end 
  • (?<=^|\|)的每個元素是正回顧後其中的開頭相匹配行或|
  • .+?抓住一個或多個字符的非貪婪地(以不吞噬的行的其餘部分),則匹配|,然後,如果存在的話(在?用於非捕獲基),比其他零多個字符|直到行尾。
  • map|添加到數組中每個字符串的開頭。用於改進正則表達式

打開挑戰:

  • 它,而不是施加到每一行,它適用於包含有所有行上的字符串,返回包含用於每個行字符串數組的數組。
  • 消除map
0

我從所提供的意見和例子注意到,你不希望在行的開頭來捕捉圓規,也許是因爲就是沒有|左側,也是結果始終只有|上左側,[|, ||, |:, :|, ..., etc在右側。
嘗試這種模式:

(?<=[\]:|])([^|\r\n]+\|[:\]]?) 

的事情是,你無法捕捉由同一捕獲組相同的字符的兩倍,因此你必須放棄左側捕捉|並添加稍後用您的腳本語言。

(?<=[\]:|])  # a look-behind for any of "]:|" 
(    # capture gourp 1 
    [^|\r\n]+ # anything that is not one of "|\r\n" 
    \|   # followed by "|" 
    [:\]]?  # followed by and optional one of ":]" 
)    # end of capture group 1 

Demo
希望它可以幫助