Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.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 围绕选择逗号拆分字符串的复杂要求_Ruby_Regex_Jruby - Fatal编程技术网

Ruby 围绕选择逗号拆分字符串的复杂要求

Ruby 围绕选择逗号拆分字符串的复杂要求,ruby,regex,jruby,Ruby,Regex,Jruby,TL;博士 我需要一些帮助来制作一个正则表达式,它可以匹配字符串中的任何逗号,这些逗号周围和之间有无限的空白。逗号及其周围的空白不能在匹配的单引号或双引号内。然后,我需要从这些逗号周围捕获非空白值,并计算其中有多少个逗号 从逗号周围捕获的值将在最终数组中成为它们自己的值,而计数的逗号将成为添加到最终数组中的零值 对问题的解释: 这是一个非常复杂的问题,因此非常感谢您的帮助。我正在为我已经使用了一段时间的库添加功能。我有一个包含数组的字符串 "['d,og,f:asdf,:hello,",,\",

TL;博士

我需要一些帮助来制作一个正则表达式,它可以匹配字符串中的任何逗号,这些逗号周围和之间有无限的空白。逗号及其周围的空白不能在匹配的单引号或双引号内。然后,我需要从这些逗号周围捕获非空白值,并计算其中有多少个逗号

从逗号周围捕获的值将在最终数组中成为它们自己的值,而计数的逗号将成为添加到最终数组中的零值

对问题的解释:

这是一个非常复杂的问题,因此非常感谢您的帮助。我正在为我已经使用了一段时间的库添加功能。我有一个包含数组的字符串

"['d,og,f:asdf,:hello,",,\",,alsee',,,'ho,la', "-123,4,5.3", true,   :good, false,,, "gr\'\'\'true,\',\'ee\"n", ":::testme", true]"
我只想将这个字符串拆分为选择逗号,这样我就有了一个包含以下值的数组

'd,og,f:asdf,:hello,",,\",,alsee'
nil
nil
'ho,la'
"-123,4,5.3"
true
:good
false
nil
nil
"gr\'\'\'true,\',\'ee\"n"
":::testme"
true
然后
nil
值来自没有包含在任何字符串中的并排逗号。我编写了以下正则表达式来拆分上面的字符串(我已经去掉了开始和结束括号):

所有值都是字符串,可以通过其周围的双引号看到。然而,他们不会都以这种方式结束。true或false将转换为布尔值。由内部引号包围的值将以字符串结束。然后前面带有
的值将作为符号结束

索引
0
4
处的值存在问题。索引
0
应为:

(0.0) "'d,og,f:asdf,:hello,",,\",,alsee'"
(0.1) nil
(0.2) nil
(4.0) "   :good"
(4.1) " false"
(4.2) nil
(4.3) nil
如您所见,末尾的两个逗号不见了。它们已成为您在上面看到的两个
nil
值。然后字符串从第一个单引号开始,到最后一个单引号结束,表示数组中的这个值是一个字符串

然后索引
4
“:good,false,,”
)应该是:

(0.0) "'d,og,f:asdf,:hello,",,\",,alsee'"
(0.1) nil
(0.2) nil
(4.0) "   :good"
(4.1) " false"
(4.2) nil
(4.3) nil
末尾的两个逗号已变为
nil
。然后,
“false”
是它自己的值,稍后将转换为布尔值,
“:good”
也是它自己的值,稍后将转换为符号

为了解决索引
4
的问题,我让所有的值通过第二个正则表达式运行。这是:

/^(\s*:(?:(?:[\w]+|\"[\s\S]+\"|'[\s\S]+')\s*)),([\s\S]*)$/
我没有拆分这个,而是得到了捕获组。它最终返回这个数组作为索引
4
处的值:

(4.0) "   :good"
(4.1) " false,,"
这就是我想要的,除了一个问题。索引
4.1
“false,,”
)处的值有两个尾随逗号,在数组中应为
nil

我需要一些帮助来制作一个正则表达式,它可以匹配字符串中的任何逗号,这些逗号周围和之间有无限的空白。逗号及其周围的空白不能在匹配的单引号或双引号内。然后,我需要从这些逗号周围捕获非空白值,并计算其中有多少个逗号

从逗号周围捕获的值将在最终数组中成为它们自己的值,而计数的逗号将成为添加到最终数组中的零值。

“['d,og,f:asdf,:hello,” ,,\ “,,alsee',,,ho,la',” -123,4,5.3 “,对,:好,错,,” gr\ '\' 我数了4个字符串。3个用双引号括起来,最后一个用单引号括起来? 你说这被你的regx分解成更小的字符串。但是4个字符串之外的字符呢? 对不起,看起来有点乱。
试着把它全部放在一个here文档字符串中,然后用一个regx将其分解。

我自己终于找到了答案。如果你看一下上面问题的描述,你会发现它是如何与其余部分相适应的

/^(([\s]*,)*)[\s]*((?::[\w]+)|(?::?(?:\"[\s\S]*\")|(?:'[\s\S]*')|false|true))?(([\s]*,)*)$/

您确定要的是正则表达式而不是CSV解析器吗?您的输入似乎不是字符串,因为它包含未转换的双引号。@CarySwoveland我允许在初始字符串中使用它。我通过一个错误检查程序读取最终值,该错误检查程序会准确地告诉用户任何值的错误。您刚才提到的未转换双引号问题d抛出一个错误并告诉用户哪个值有问题。@user3277393我将查看csv。它可能正是我所需要的。然后是否转义未转义的双引号?如果是,为什么在示例中没有这样做?如果不是,我们该如何处理它?这里是转义的双引号:
“[d,og,f:asdf,:您好,\“,\”,,“ho,la',\“-123,4,5.3\”,真,:好,假,,“gr\”,“真,\”,“ee\“n\”,“:::testme\”,真]“