使用正则表达式拆分,负面看后面和前面跳到块内
问题描述:
给定一个字符串,我需要在正斜杠上拆分字符串,但前提是斜杠不出现在{}块中。使用正则表达式拆分,负面看后面和前面跳到块内
我知道这可以通过各种其他方式完成。在这一点上,我只想看看这是否可能以及正则表达式的样子。如果它功能强大,它可能会加快程序的速度。赢得胜利。 :)
在以下示例中使用perl,尽管它最终可能会以其他语言实现。
实际上,这就是我想做的事:
#!/bin/perl -w
use strict;
use Data::Dumper;
my @strings = (
"/this/that",
"/this/",
"/this/{ID=/foo\/bar/}",
"/this/{ID=foo/bar}",
"/this/{/}",
"/this/{ID=/foobar/}/that/foo/",
"/this/{ID=f/o/o/b/a/r/}",
"/this/{ID=/foobar/}/that/{bar}/that"
);
foreach my $string (@strings) {
print $string."\n";
my @items = split(/(?<!{.*?)\/(?!.*?})/,$string);
print Dumper(\@items);
}
的问题是,你不能使用可变长度向后看。
所以,我一直在玩只用前瞻来完成同样的事情。
最近我已经能够使用这条线分割来:
my @items = split(/\/(?![^{].*?}|})/,$string);
,几乎得到它,但{}块之前不会分裂开/。所以,我结束了这样的结果:
$VAR1 = [
'/this',
'{ID=/foobar/}/that',
'{bar}',
'that'
];
它应该是:提前
$VAR1 = [
'this',
'{ID=/foobar/}',
'that',
'{bar}',
'that'
];
感谢。
答
您可以将当前的正则表达式更改为:
/(?![^{]*\})
它将匹配/
如果没有}
在它前面的。
例如,如果有匹配项here,您将得到一个分割。
但我认为这可能会更容易与一场比赛,而不是?
\{[^}]*\}|[^/]+
现在,上面的假设没有在字符串中括号的嵌套。
你不需要逃避尾随......但是是的。非常好。 我很接近...讨厌被关闭,不得不问问:) 谢谢 – mbond
@mbond如果他们不在字符类中,我通常会转义元字符,所以正则表达式更加便携,对不起^^ ;.别客气! – Jerry