2017-05-15 193 views
2

我想找到一個正確的正則表達式來選擇另一個子字符串之間的子字符串,我想排除它。例如,在此字符串:用於在字符串前後選擇子字符串的正則表達式

11 - 12£ in $ + 13 

我想選擇12£$。基本上,它是子周圍in,直到我打值我要爲最終使用/啓動,在這種情況下,算術運算符%w(+ -/*)數組

到目前爲止最接近我得到的是使用這個正則表達式/(.\d\p{Sc})\sin\s(\p{Sc})/

一些更例子:

10 - 12$ in £ - 13$應該返回12$£

12 $ in £應該返回12$£

100£in$應該返回100£$

+0

無論如何,你將不得不後處理這些匹配,因爲你不能跳過匹配的一部分。最簡單的方法是使用'(\ d [\ d \ s] * \ p {Sc})\ sin \ s(\ p {Sc})'並從組1中刪除空格。 –

回答

2
sentence.match(/[^-+*\/]*in[^-+*\/]*/).to_s.strip.split(/ *in */) 
  • [^-+*\/]*匹配多個非算術運算符
  • 這將因此得到一切從「開放」「關閉」操作員環繞一個in
  • #strip刪除l eading和尾部空格
  • 最後,分成兩個字符串,刪除in和空間周圍
+0

這似乎有效,一場比賽。如果我有£12英鎊 - 英鎊4英鎊,它只會返回第一對 –

+1

@MaximFedotov使用'scan'和'map'代替。 – ndn

+1

@MaximFedotov - 您可以使用scan.scan(/ [^ - + * \ /] *在[^ - + * \ /] * /)進行掃描:map {| el | el.to_s.strip.split(/ * in * /)}' – seph

0
r =/
    \s+[+*\/-]\s+ # match 1+ whitespaces, 1 char in char class, 1+ whitespaces 
    (\S+)   # match 1+ non-whitespaces in capture group 1 
    \s+in\s+  # match 1+ whitespaces, 'in', 1+ whitespaces 
    (\S+)   # match 1+ non-whitespaces in capture group 2 
    \s+[+*\/-]\s # match 1+ whitespaces, 1 char in char class, 1+ whitespaces 
    /x   # free-spacing regex definition mode 

str = '11 -  12£ in $ + 13/13F in % * 4' 
str.scan(r) 
    #=> [["12£", "$"], ["13F", "%"]] 

看到該文檔的String#scan怎麼看scan處理捕獲組。

請注意,'-'必須是字符類[+*\/-]中的第一個或最後一個。

相關問題