如何使用多个引号获取字符串的子字符串? Rails的/红宝石

时间:2014-05-07 16:24:33

标签: ruby-on-rails ruby

给定一个像(Shift opened: \"he clams \"sick\" but not sure\")这样的字符串,我如何只提取第一组引号之间的部分?我尝试过分割,切片和挤压的组合,但总是碰到它不起作用的情况。感谢。

编辑:用户输入文本,可以是任何形式,所以是的,某人可能有奇数的引号。生成输入之前的文本以用于记录目的。一些例子:

n = (Shift opened: \"he clams \"sick\" but not sure\")
n.split('"')[1] > "he claims "

如果我能找到通过拆分创建的数组的大小,我可以split('"')[1..size-1],但我不知道如何找到它。

n = (Shift opened: \"\"sick\"\")
n.squeeze('"').split('"')[1] >> "sick"

工作正常。

这更适用于错误检查,并确保人们在输入时使用引号,它不会搞砸。不,我不能编辑字符串的生成方式。希望我足够清楚!

2 个答案:

答案 0 :(得分:1)

您可以利用默认情况下正则表达式贪婪的事实,并使用/"(.*)",它将捕获第一个和最后一个引号之间的所有文本:

n = 'Shift opened: "he clams "sick" but not sure" some more text'

n[/"(.*)"/, 1]
# => "he clams "sick" but not sure" 

n = "Shift opened: \"\"sick\"\""
n[/"(.*)"/, 1]
# => ""sick""

答案 1 :(得分:0)

我不确定你是否想要递归地提取引号上的文字并得到这样的内容:

=> "he clams "sick" but not sure"
=> "sick"

or "lorem ipsum "xxxxx yyyy "alpha beta" zzzz wwww" dol"
=> "lorem ipsum "xxxxx yyyy "alpha beta" zzzz wwww" dol"
=> "xxxxx yyyy "alpha beta" zzzz wwww"
=> "alpha beta"

也许你需要一个简单的CFG:

S -> aS | a
a = /\".*\"/

或迭代每个引号上的字符串堆叠子串