Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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正则表达式中$1和$2的用途:s/^([^,]+;,)ab.([^,]+;,)(?:[^,]+;,)/$1$2/_Regex_Perl - Fatal编程技术网

Regex 本Perl正则表达式中$1和$2的用途:s/^([^,]+;,)ab.([^,]+;,)(?:[^,]+;,)/$1$2/

Regex 本Perl正则表达式中$1和$2的用途:s/^([^,]+;,)ab.([^,]+;,)(?:[^,]+;,)/$1$2/,regex,perl,Regex,Perl,有人能告诉我下面Perl正则表达式的含义吗: $_ =~ s/^([^,]+,)ab.([^,]+,)(?:[^,]+,)/$1$2/; $1和$2的作用是什么?这些变量是如何定义的?$1和$2变量是匹配变量 在正则表达式中,当某些内容被括号包围时,正则表达式的该部分(如果匹配)将存储在$n变量中 例如:/(\d+),(\w+)/将匹配类似于123的内容,其中xyz将123分配给$1,xyz分配给$2。它们是按照它们在正则表达式中出现的顺序分配的 请注意,前导括号后面的“?:”,即(?:…),

有人能告诉我下面Perl正则表达式的含义吗:

$_ =~ s/^([^,]+,)ab.([^,]+,)(?:[^,]+,)/$1$2/;

$1
$2
的作用是什么?这些变量是如何定义的?

$1和$2变量是匹配变量

在正则表达式中,当某些内容被括号包围时,正则表达式的该部分(如果匹配)将存储在$n变量中

例如:/(\d+),(\w+)/将匹配类似于123的内容,其中xyz将123分配给$1,xyz分配给$2。它们是按照它们在正则表达式中出现的顺序分配的

请注意,前导括号后面的“?:”,即(?:…),告诉正则表达式不要将匹配的值保存在$n变量中

下面的示例代码演示了正则表达式使用Perl所做的工作。请注意,您的问题中似乎缺少正则表达式上的前导s(用于替换)

文件:test.pl

#!/usr/bin/perl

print $ARGV[0], "\n";
$ARGV[0] =~ s/^([^,]+,)ab.([^,]+,)(?:[^,]+,)/$1$2/;
print "\$1 = $1\n";
print "\$2 = $2\n";
print $ARGV[0], "\n";
执行:

%> ./test.pl str1,ab.str2,str3,str4,
str1,ab.str2,str3,str4,
$1 = str1,
$2 = str2,
str1,str2,str4,

正则表达式表示:

^          Start of string
(          Start of capturing group -> $1
 [^,]+     Any character except ",", one or more times
 ,         A literal ","
)          End of capturing group
ab         "ab"
.          Any character
([^,]+,)   Same as previously -> $2
(?:        Start a non-capturing group
    [^,]+, Same as previously
)          End group

每个捕获组按照它们在正则表达式中出现的顺序放入一个编号的变量中,这看起来不像有效的perl代码。我猜在第一个
/
之前应该有一个
s
,可能
=
应该是
=~
。请重新检查您键入的内容——理想情况下,从您在中找到的脚本复制并粘贴。请注意,主题中不需要有文字点,因为
表示任何任意字符(断行字符除外)。由于未设置点all修饰符
s
仅表示除换行字符以外的任何字符。