我为我在这里发布的非常具体的问题道歉,但我希望它能帮助其他可能遇到这个问题的人。我有一个字符串格式化为以下:
[[,action1,,],[action2],[]]
我想将此转换为有效的YAML,以便可以解析它看起来像这样:
[['','acton1','',''],['action2'],['']]
我已经尝试了一堆正则表达式来实现这一点,但我担心我会完全失败。如果需要,我可以运行多个表达式。例如(红宝石):
puts s.gsub!(/,/,"','") # => [[','action1','',']','[action2]','[]]
puts s.gsub!(/\[',/, "['',") # => [['','action1','',']','[action2]','[]]
那已经到了那里,但我有一种感觉,我开始用这种方法陷入困境。有没有更好的方法来实现这一目标?
感谢您的帮助!
答案 0 :(得分:4)
这是空字段(ruby1.9)的工作:
s.gsub(/(?<=[\[,])(?=[,\]])/, "''")
或者对于不支持零宽度后视的ruby1.8:
s.gsub(/([\[,])(?=[,\]])/, "\\1''")
可以使用以下方法之一来引用非空字段:
s.gsub(/(?<=[\[,])\b|\b(?=[,\]])/, "'")
s.gsub(/(\w+)/, "'\\1'")
在上面我使用了零宽度正向后观和零宽度正向前看断言('(?&lt; ='和'(?=')。
我已经找了一些特定于ruby的文档,但找不到任何能够解释这些特性的文档。相反,请让我推荐您perlre。
答案 1 :(得分:3)
因为我不懂Ruby,所以这是Perl的一个例子。
由于您只想要一个YAML的子集,看起来与JSON类似,我使用了JSON
模块。
我一直想找借口使用Regexp::Grammars
,所以我用它来解析数据。
我保证无论阵列有多深,它都能正常工作。
#! /usr/bin/env perl
use strict;
#use warnings;
use 5.010;
#use YAML;
use JSON;
use Regexp::Grammars;
my $str = '[[,action1,,],[action2],[],[,],[,[],]]';
my $parser = qr{
<match=Array>
<token: Text>
[^,\[\]]*
<token: Element>
(?:
<.Text>
|
<MATCH=Array>
)
<token: Array>
\[
(?:
(?{ $MATCH = [qw'']; })
|
<[MATCH=Element]> ** (,)
)
\]
}x;
if( $str =~ $parser ){
say to_json $/{match};
}else{
die $@ if $@;
}
哪个输出。
[["","action1","",""],["action2"],[],["",""],["",[],""]]
如果您真的想要YAML,请取消评论“use YAML;
”,并将to_json()
替换为Dump()
---
-
- ''
- action1
- ''
- ''
-
- action2
- []
-
- ''
- ''
-
- ''
- []
- ''
答案 2 :(得分:1)
试试这个:
s.gsub(/([\[,])(?=[,\]])/, "\\1''")
.gsub(/([\[,])(?=[^'\[])|([^\]'])(?=[,\]])/, "\\+'");
编辑:我不确定替换语法。那应该是第一个gsub
中的第一组,以及第二个中编号最高的参与组 - $+
。