2017-05-15 149 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处理捕获组。

请注意,'-'必须是字符类[+*\/-]中的第一个或最后一个。

相关问题