Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl正则表达式匹配模式的多个实例并替换_Regex_Perl - Fatal编程技术网

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",
# ]