3

对于我在此处发布的非常具体的问题,我深表歉意,但我希望它能帮助其他可能也遇到此问题的人。我有一个字符串被格式化为以下内容:

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

我想将其翻译为有效的 YAML,以便对其进行解析,如下所示:

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

我已经尝试了一堆正则表达式来完成这个,但我担心我完全不知所措。如果需要,我可以运行多个表达式。例如(红宝石):

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

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

谢谢您的帮助!

4

3 回答 3

4

这为空字段(ruby1.9)完成了工作:

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

或者对于不支持零宽度后视的 ruby​​1.8:

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

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

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

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

我寻找了一些 ruby​​ 特定的文档,但找不到任何特别解释这些功能的东西。相反,请让我将您推荐给perlre

于 2009-08-20T02:47:59.360 回答
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
- []
-
  - ''
  - ''
-
  - ''
  - []
  - ''
于 2009-08-20T05:39:36.973 回答
1

尝试这个:

s.gsub(/([\[,])(?=[,\]])/, "\\1''")
 .gsub(/([\[,])(?=[^'\[])|([^\]'])(?=[,\]])/, "\\+'");

编辑:我不确定替换语法。这应该是第一组中的第一组,第二gsub组中参与人数最多的组$+

于 2009-08-20T03:19:04.147 回答