Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 一组字符串的正则表达式_Ruby On Rails_Ruby_Regex_String_Grep - Fatal编程技术网

Ruby on rails 一组字符串的正则表达式

Ruby on rails 一组字符串的正则表达式,ruby-on-rails,ruby,regex,string,grep,Ruby On Rails,Ruby,Regex,String,Grep,大家好,我正在使用ruby 1.8.7,我需要一个正则表达式来将字符串拆分为单词。 下面是一些例子 SSAI @ 37C final OD=2.3 @ 16.6h, 492mg/3L, 0% soluble ss autoinduction @37C overnight, OD=2.1@16.6hrs, 487mg/3L, 70%soluble AF 0.3mM IPTG induce@10C 24hrs OD=0.2@5.6h, 19mg/3L, 50%soluble AF, 0.3mM IP

大家好,我正在使用ruby 1.8.7,我需要一个正则表达式来将字符串拆分为单词。 下面是一些例子

SSAI @ 37C final OD=2.3 @ 16.6h, 492mg/3L, 0% soluble
ss autoinduction @37C overnight, OD=2.1@16.6hrs, 487mg/3L, 70%soluble
AF 0.3mM IPTG induce@10C 24hrs OD=0.2@5.6h, 19mg/3L, 50%soluble
AF, 0.3mM IPTG @ 37C, IND @ OD 0.55 @ 4hrs, 476mg/12L, 0% soluble
这是拆分(关于第一个示例)

  • SSAI(第一个@之前的所有内容)
  • 37(第一个@后面的整数)
  • 2.3(第二个@之前浮动)
  • 16.6(第二个@后浮动)
  • 492和493(图案mg/*L)
  • 0(在百分比之前)
我有一组具有相同模式的字符串,我希望在这些字符串上运行regex并将其导入数据库。


或者,使用该正则表达式,然后设置$1、$2等等。

这将为每个所需的集合生成子组。但是,它不能将第五组中的492和3分为一个子组,因此它们分别成为第五组和第六组,并将%可溶性推到第七个子组:

/^(.*?) @ (\d+)\D+(\d+\.\d+) @ (\d+\.\d+)\D+(\d+)mg\/(\d+)L\D*(\d+)%/

这就是我能想到的。 如果有人有任何建议,请开枪。 谢谢


这似乎对所有输入都起到了作用。其想法是分两步执行操作。首先按“/@/”拆分字段,将第一个字段保存到以后,然后在其余字段中搜索小数

first, *rest = str.split(/@/)
rest.map!{|s| s.scan(/\d+\.?\d*/)}.flatten!

first
#=> "SSAI "

rest
#=> ["37", "2.3", "16.6", "492", "3", "0"]
完整示例:

def extract(source)
  first, *rest = str.split(/@/)
  rest.map!{|s| s.scan(/\d+\.?\d*/)}.flatten!
  [first, *rest]
end

input = "SSAI @ 37C final OD=2.3 @ 16.6h, 492mg/3L, 0% soluble
ss autoinduction @37C overnight, OD=2.1@16.6hrs, 487mg/3L, 70%soluble
AF 0.3mM IPTG induce@10C 24hrs OD=0.2@5.6h, 19mg/3L, 50%soluble
AF, 0.3mM IPTG @ 37C, IND @ OD 0.55 @ 4hrs, 476mg/12L, 0% soluble"

input.lines.each do |line|
  p extract(line)
end

# ["SSAI ", "37", "2.3", "16.6", "492", "3", "0"]
# ["ss autoinduction ", "37", "2.1", "16.6", "487", "3", "70"]
# ["AF 0.3mM IPTG induce", "10", "24", "0.2", "5.6", "19", "3", "50"]
# ["AF, 0.3mM IPTG ", "37", "0.55", "4", "476", "12", "0"]

请提供有关字符串结构的更多信息。它会一直像上面那样吗?检测每个子字符串的触发器是什么?请至少再给出一个输入/输出示例,以便我们了解模式的确切含义。还有:到目前为止你都试过什么?实际问题在哪里?很少有人愿意只做你的工作。而且你确定
492mg/3L
中的
3
不应该匹配吗?@p11y我已经修改了这个问题,很抱歉前面的例子很模糊。这是一个很好的开始。谢谢@Philip HallstromI我觉得这里的正则表达式有点太具体了。这个例子中的第四行看起来不适用。是的,我正在尽可能地使它通用化。我不知道如何开始,因为这是我第一次使用正则表达式。上面的例子让我了解了它的工作原理@在第一个@之后不需要Coenwulf{1}。如果第三组中的浮点值为10或更高,则第二组和第三组之间的.*将导致问题,因为.*是贪婪的。改为使用\D+(一个或多个非数字字符)将修复它。除此之外,它看起来是可行的。
first, *rest = str.split(/@/)
rest.map!{|s| s.scan(/\d+\.?\d*/)}.flatten!

first
#=> "SSAI "

rest
#=> ["37", "2.3", "16.6", "492", "3", "0"]
def extract(source)
  first, *rest = str.split(/@/)
  rest.map!{|s| s.scan(/\d+\.?\d*/)}.flatten!
  [first, *rest]
end

input = "SSAI @ 37C final OD=2.3 @ 16.6h, 492mg/3L, 0% soluble
ss autoinduction @37C overnight, OD=2.1@16.6hrs, 487mg/3L, 70%soluble
AF 0.3mM IPTG induce@10C 24hrs OD=0.2@5.6h, 19mg/3L, 50%soluble
AF, 0.3mM IPTG @ 37C, IND @ OD 0.55 @ 4hrs, 476mg/12L, 0% soluble"

input.lines.each do |line|
  p extract(line)
end

# ["SSAI ", "37", "2.3", "16.6", "492", "3", "0"]
# ["ss autoinduction ", "37", "2.1", "16.6", "487", "3", "70"]
# ["AF 0.3mM IPTG induce", "10", "24", "0.2", "5.6", "19", "3", "50"]
# ["AF, 0.3mM IPTG ", "37", "0.55", "4", "476", "12", "0"]