Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_String_Perl_Split - Fatal编程技术网

Regex Perl使用*&引用;

Regex Perl使用*&引用;,regex,string,perl,split,Regex,String,Perl,Split,如果我像这样使用split: my @split = split(/\s*/, $line); print "$split[1]\n"; 使用输入: catdog 我得到: a 但是,如果我在拆分中使用\s+,我会得到: dog 我很好奇为什么它们不能产生相同的结果?另外,按字符分割字符串的正确方法是什么 感谢您的帮助。*匹配0次或更多次。这意味着它可以匹配字符之间的空字符串+匹配1次或多次,这意味着它必须至少匹配一个字符 以下文件对此进行了说明: 如果模式匹配空字符串,则EXPR将在匹配位置

如果我像这样使用
split

my @split = split(/\s*/, $line);
print "$split[1]\n";
使用
输入

catdog

我得到:

a

但是,如果我在
拆分
中使用
\s+
,我会得到:

dog

我很好奇为什么它们不能产生相同的结果?另外,按字符分割字符串的正确方法是什么


感谢您的帮助。

*
匹配0次或更多次。这意味着它可以匹配字符之间的空字符串<代码>+匹配1次或多次,这意味着它必须至少匹配一个字符

以下文件对此进行了说明:

如果模式匹配空字符串,则EXPR将在匹配位置(字符之间)拆分

此外,当您使用空格分隔时,大多数情况下您确实希望使用文字空间:

.. split ' ', $line;
如下所述:

作为另一种特殊情况,“split”模拟 当模式被省略或是文字时,命令行工具awk 由单个空格字符组成的字符串(如“”或“\x20”, 但不是例如“/”)。在本例中,EXPR中的任何前导空格都是 在发生拆分之前删除,而将该模式视为 如果是“/\s+/”;特别是,这意味着任何连续的 空格(不仅仅是单个空格字符)用作分隔符。 但是,可以通过指定 模式“/”而不是字符串“”,因此只允许 单个空格字符作为分隔符


*
匹配0次或更多次。这意味着它可以匹配字符之间的空字符串<代码>+匹配1次或多次,这意味着它必须至少匹配一个字符

以下文件对此进行了说明:

如果模式匹配空字符串,则EXPR将在匹配位置(字符之间)拆分

此外,当您使用空格分隔时,大多数情况下您确实希望使用文字空间:

.. split ' ', $line;
如下所述:

作为另一种特殊情况,“split”模拟 当模式被省略或是文字时,命令行工具awk 由单个空格字符组成的字符串(如“”或“\x20”, 但不是例如“/”)。在本例中,EXPR中的任何前导空格都是 在发生拆分之前删除,而将该模式视为 如果是“/\s+/”;特别是,这意味着任何连续的 空格(不仅仅是单个空格字符)用作分隔符。 但是,可以通过指定 模式“/”而不是字符串“”,因此只允许 单个空格字符作为分隔符


\s*
实际上意味着零个或多个空白字符。在
cat
中的
c
a
之间是零空格,产生您看到的结果

对于正则表达式引擎,字符串如下所示:

c
    zero spaces
a
    zero spaces
t
    multiple spaces
d
    zero spaces
o
    zero spaces
g

按照此逻辑,如果使用
\s+
作为分隔符,它将只匹配
cat
dog
之间的多个空格

\s*
实际上意味着零个或多个空白字符。在
cat
中的
c
a
之间是零空格,产生您看到的结果

对于正则表达式引擎,字符串如下所示:

c
    zero spaces
a
    zero spaces
t
    multiple spaces
d
    zero spaces
o
    zero spaces
g

按照此逻辑,如果使用
\s+
作为分隔符,它将只匹配
cat
dog
之间的多个空格

如果要将字符串拆分为单个字符列表,则应使用空正则表达式模式进行拆分,如下所示

my $line = 'cat';
my @split = split //, $line;
print "$_\n" for @split;
my @split = unpack '(A1)*', $line;
输出

c
a
t
有些人喜欢像这样解包

my $line = 'cat';
my @split = split //, $line;
print "$_\n" for @split;
my @split = unpack '(A1)*', $line;

这会给出完全相同的结果。

如果要将字符串拆分为单个字符列表,则应使用空正则表达式模式进行拆分,如下所示

my $line = 'cat';
my @split = split //, $line;
print "$_\n" for @split;
my @split = unpack '(A1)*', $line;
输出

c
a
t
有些人喜欢像这样解包

my $line = 'cat';
my @split = split //, $line;
print "$_\n" for @split;
my @split = unpack '(A1)*', $line;

这给出了完全相同的结果。

啊,我明白了。谢谢,罗比。啊,我明白了。谢谢你,罗比。