在分隔符之间提取字符串

时间:2015-07-15 17:47:51

标签: ruby regex

如何在分隔符/多个分隔符之间获得的子字符串?例如:

Dim Regex As RegExp
Dim Matches As MatchCollection

Set Regex = New RegExp
Regex.Pattern = "\d*\.\d*"
Regex.Global = True

Set Matches = Regex.Execute("77.170 (+/- 0.025)")

MsgBox (Matches(0).Value & " " & Matches(1).Value)

我尝试过使用split,但是有一个优雅的解决方案吗?

3 个答案:

答案 0 :(得分:5)

你需要一个这样的外观正则表达式:

(?<=X)[^X]+(?=X)

RegEx Demo

在Ruby中,您可以使用string.scan(regex)来获取所有匹配

答案 1 :(得分:0)

我认为这很优雅:

str.split(delim, -1)[1...-1].reject(&:empty?)

与anubhava的答案不同,这甚至适用于多字符分隔符。 -1的{​​{1}}参数阻止它抑制尾随空字段,这是必需的,因为您需要知道字符串是否以分隔符结尾。

split

答案 2 :(得分:0)

其他几种方式:

1:修剪字符串并使用String#scan

def some_method(str, c)
  str.gsub(/^[^#{c}]+|[^#{c}]+$/,"").scan /[^#{c}]+/
end

some_method("00990099", "9")         #=> ["00"] 
some_method("00XXX00XX0X00X00", "X") #=> ["00", "0", "00"] 
some_method("0000", "9")             #=> [] 
some_method("9999", "9")             #=> [] 

2:分组并使用Enumerable#each_cons

def some_method(str, c)
  str.gsub(r) split(/(#{c}+)/)
     .each_cons(3)
     .with_object([]) { |(_,s,_),a| a << s unless s =~ /#{c}/ } 
end

some_method("00990099", "9")         #=> ["00"] 
some_method("00XXX00XX0X00X00", "X") #=> ["00", "0", "00"] 
some_method("0000", "9")             #=> [] 
some_method("9999", "9")             #=> [] 

请注意,使用String#split时,正则表达式中的#{c}+必须位于捕获组中,以保留c被分割的str组。