我很难将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));
通过替换字符类[]
中的内容而没有成功。
{}
群组中唯一允许不的字符为{
或}
答案 0 :(得分:5)
由于您没有处理嵌套大括号,因此您想要的句点不是“立即”后跟关闭}
的句点。 “立即”的意思是,中间没有开口{
:
split(/[.]\s*(?![^{]*[}])/g, $string)
或者,匹配您感兴趣的部分:
(?:[^.{}]|[{][^{}]*[}])+
哪个可以是"unrolled":
[^.{}]*(?:[{][^{}]*[}][^.{}]*)*
答案 1 :(得分:1)
以下是我将如何解决问题:
我们定义一个项目:
my $item = qr/ \w+ (?: [{] [^{}]* [}] )? /x;
也就是说,一些单词字符和大括号内的一个部分。
我们定义项目组,用逗号分隔:
my $item_group = qr/$item \s* (?: , \s* $item \s* )*/x;
即$item
后跟零个或多个逗号项序列。
我们通过匹配一个后跟句点或字符串结尾的项目组来提取结果:
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}",
)
答案 2 :(得分:0)
你可以做一个匹配而不是分割,将大括号的替代品与它们之间的任何东西(大括号除外)或非大括号的东西匹配,除了一个点。