如何用nil值解析YAML?

时间:2009-08-20 00:18:07

标签: ruby regex parsing yaml

我为我在这里发布的非常具体的问题道歉,但我希望它能帮助其他可能遇到这个问题的人。我有一个字符串格式化为以下:

[[,action1,,],[action2],[]]

我想将此转换为有效的YAML,以便可以解析它看起来像这样:

[['','acton1','',''],['action2'],['']]

我已经尝试了一堆正则表达式来实现这一点,但我担心我会完全失败。如果需要,我可以运行多个表达式。例如(红宝石):

puts s.gsub!(/,/,"','")  # => [[','action1','',']','[action2]','[]]
puts s.gsub!(/\[',/, "['',") # => [['','action1','',']','[action2]','[]]

那已经到了那里,但我有一种感觉,我开始用这种方法陷入困境。有没有更好的方法来实现这一目标?

感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

这是空字段(ruby1.9)的工作:

s.gsub(/(?<=[\[,])(?=[,\]])/, "''")

或者对于不支持零宽度后视的ruby1.8:

s.gsub(/([\[,])(?=[,\]])/, "\\1''")

可以使用以下方法之一来引用非空字段:

s.gsub(/(?<=[\[,])\b|\b(?=[,\]])/, "'")
s.gsub(/(\w+)/, "'\\1'")

在上面我使用了零宽度正向后观和零宽度正向前看断言('(?&lt; ='和'(?=')。

我已经找了一些特定于ruby的文档,但找不到任何能够解释这些特性的文档。相反,请让我推荐您perlre

答案 1 :(得分:3)

解析它会更容易,然后输出有效的YAML。


因为我不懂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中的第一组,以及第二个中编号最高的参与组 - $+