在Perl中围绕外部字符分裂。组内的最小假设

时间:2013-08-01 00:59:37

标签: regex perl

我很难将this thread中的答案调整为以下问题:

我想分割以下字符串:

my $string = "foo{age}, bar{height}. something_else. baz{weight,so='yes',brothers=john.smith}.test{some}"

围绕外点。结果应该是一个包含

的数组
("foo{age}, bar{height}", 
 "foo{weight,parents='yes',brothers=john.smith}", 
 "test{some}")

我想避免假设关于{}内的群组内部的内容。

我如何在Perl中执行此操作?

我尝试调整以下内容:

print join(",",split(/,\s*(?=\w+{[a-z,]+})/g, $string));

通过替换字符类[]中的内容而没有成功。

更新

{}群组中唯一允许的字符为{}

3 个答案:

答案 0 :(得分:5)

由于您没有处理嵌套大括号,因此您想要的句点不是“立即”后跟关闭}的句点。 “立即”的意思是,中间没有开口{

split(/[.]\s*(?![^{]*[}])/g, $string)

或者,匹配您感兴趣的部分:

(?:[^.{}]|[{][^{}]*[}])+

哪个可以是"unrolled"

[^.{}]*(?:[{][^{}]*[}][^.{}]*)*

答案 1 :(得分:1)

以下是我将如何解决问题:

  1. 我们定义一个项目:

    my $item = qr/ \w+ (?: [{] [^{}]* [}] )? /x;
    

    也就是说,一些单词字符和大括号内的一个部分。

  2. 我们定义项目组,用逗号分隔:

    my $item_group = qr/$item \s* (?: , \s* $item \s* )*/x;
    

    $item后跟零个或多个逗号项序列。

  3. 我们通过匹配一个后跟句点或字符串结尾的项目组来提取结果:

    my @result = $string =~ /\G ($item_group) \s* (?: [.] \s* | \z)/xg;
    
  4. 输出:

    (
      "foo{age}, bar{height}",
      "something_else",
      "baz{weight,so='yes',brothers=john.smith}",
      "test{some}",
    )
    

答案 2 :(得分:0)

你可以做一个匹配而不是分割,将大括号的替代品与它们之间的任何东西(大括号除外)或非大括号的东西匹配,除了一个点。