Regex Perl正则表达式匹配模式的多个实例并替换
我有一个字符串如下所示:Regex Perl正则表达式匹配模式的多个实例并替换,regex,perl,Regex,Perl,我有一个字符串如下所示: abc[1,2,3].something.here,foo[10,6,34].somethingelse.here,def[1,2].another 我想将此字符串拆分为一个数组,该数组由以下内容组成: abc[1,2,3].something.here foo[10,6,34].somethingelse.here def[1,2].another 但是对注释进行拆分是行不通的,所以我的下一个想法是首先用其他东西替换位于方括号之间的逗号,这样我就可以对逗号进行拆分
abc[1,2,3].something.here,foo[10,6,34].somethingelse.here,def[1,2].another
我想将此字符串拆分为一个数组,该数组由以下内容组成:
abc[1,2,3].something.here
foo[10,6,34].somethingelse.here
def[1,2].another
但是对注释进行拆分是行不通的,所以我的下一个想法是首先用其他东西替换位于方括号之间的逗号,这样我就可以对逗号进行拆分,然后在事实发生后进行替换
我尝试过几种方法,但收效甚微。。有什么建议吗?您可以在模式中使用前瞻断言:
my $s = "abc[1,2,3].something.here,foo[10,6,34].somethingelse.here,def[1,2].another";
my @a = split /,(?=\w+\[)/, $s;
像这样迭代字符串中的字符(伪代码):
当然,您可以使用正则表达式,但就我个人而言,我的目标是一个更简单的解决方案,即使它更黑客。正则表达式有时读起来很痛苦 eugene y答案的另一种选择:
my $s = "abc[1,2,3].something.here,foo[10,6,34].somethingelse.here,def[1,2].another";
my @a = ($s =~ /[^,]+\[[\d,]*\]/g);
print join("\n", @a,"")
当事情变得如此复杂时,我喜欢解析器方法
#!/usr/bin/perl
use strict;
use warnings;
my $statement = "abc[1,2,3].something.here,foo[10,6,34].somethingelse.here,def[1,2].another";
my $index = qr/\[(?:\d+)(?:,\d+)*\]/;
my $variable = qr/\w+$index?/;
my $expression = qr/$variable(?:\.$variable)*/;
my @expressions = ($statement =~ /($expression)/g);
print "$_\n" for @expressions;
这个问题让我有理由看一看我想看的东西。以下代码段适用于您的输入:
use Regexp::Grammars;
use Data::Dump qw(dd);
my $input
= 'abc[1,2,3].something.here,foo[10,6,34].somethingelse.here,def[1,2].another';
my $re = qr{
<[tokens]> ** (,) # comma separated tokens
<rule: tokens> <.token>*
<rule: token> \w+ | [.] | <bracketed>
<rule: bracketed> \[ <.token> ** (,) \]
}x;
dd $/{tokens}
if $input =~ $re;
# prints
# [
# "abc[1,2,3].something.here",
# "foo[10,6,34].somethingelse.here",
# "def[1,2].another",
# ]
使用Regexp::Grammars;
使用数据::转储qw(dd);
我的$input
='abc[1,2,3]。某物。这里,foo[10,6,34]。某物。这里,def[1,2]。另一个';
我的$re=qr{
**(,)#逗号分隔标记
*
\w+|[.]|
\[ ** (,) \]
}x;
dd$/{tokens}
如果$input=~$re;
#印刷品
# [
#“abc[1,2,3]。什么东西。这里”,
#“foo[10,6,34].有些东西在这里”,
#“def[1,2]。另一个”,
# ]
太好了,我会向前看!谢谢添加host1.something.here将破坏此正则表达式。对于这个前瞻性断言,哪里是一个很好的参考?
use Regexp::Grammars;
use Data::Dump qw(dd);
my $input
= 'abc[1,2,3].something.here,foo[10,6,34].somethingelse.here,def[1,2].another';
my $re = qr{
<[tokens]> ** (,) # comma separated tokens
<rule: tokens> <.token>*
<rule: token> \w+ | [.] | <bracketed>
<rule: bracketed> \[ <.token> ** (,) \]
}x;
dd $/{tokens}
if $input =~ $re;
# prints
# [
# "abc[1,2,3].something.here",
# "foo[10,6,34].somethingelse.here",
# "def[1,2].another",
# ]