3

我很难使该线程中的答案适应以下问题:

我想拆分以下字符串:

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));

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

更新:

组内唯一不允许的字符{}{}

4

3 回答 3

5

由于您没有处理嵌套大括号,因此您想要的句点不是“立即”后跟一个结束的句点}。其中“立即”是指,{中间没有开口:

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

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

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

可以“展开”到:

[^.{}]*(?:[{][^{}]*[}][^.{}]*)*
于 2013-08-01T01:09:27.233 回答
1

这是我解决问题的方法:

  1. 我们定义一个项目:

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

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

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

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

    也就是说,an$item后跟零个或多个逗号项序列。

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

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

输出:

(
  "foo{age}, bar{height}",
  "something_else",
  "baz{weight,so='yes',brothers=john.smith}",
  "test{some}",
)
于 2013-08-01T01:36:46.947 回答
0

您可以进行匹配而不是拆分,将大括号的替代项与它们之间的任何内容(大括号除外)或非大括号与除点之外的任何内容进行匹配。

于 2013-08-01T01:09:00.737 回答