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/8/perl/11.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,我有一个正则表达式,它匹配文本文件中一行中的多个字符串。但是,当我使用它来打印捕获组的所有实例时,它只打印第一个实例 我的正则表达式是: /"resolution.(\w+)/g 将以下行馈送到正则表达式时: "signalcfg": "{\"signals\":[{\"order\":1,\"id\":\"oryx_C20C0E15-2028-4F4B-A8DD-0DA8D87B4FF9\",\"name\":\"success\",\"rrcodes\":\"resolution.COMP

我有一个正则表达式,它匹配文本文件中一行中的多个字符串。但是,当我使用它来打印捕获组的所有实例时,它只打印第一个实例

我的正则表达式是:

/"resolution.(\w+)/g
将以下行馈送到正则表达式时:

"signalcfg": "{\"signals\":[{\"order\":1,\"id\":\"oryx_C20C0E15-2028-4F4B-A8DD-0DA8D87B4FF9\",\"name\":\"success\",\"rrcodes\":\"resolution.COMPLAINTS_CHANGE_STATUS_SUCCESS\",\"testModule\":\"MCSChangeComplaintsStatus\",\"default\":false},{\"order\":2,\"id\":\"oryx_C943ADB8-6FA2-4DA1-B4D7-24515D96B9DA\",\"name\":\"TimeOut\",\"rrcodes\":\"resolution.MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT\",\"testModule\":\"MCSChangeComplaintsStatus\",\"default\":false},{\"order\":3,\"id\":\"oryx_0CAC0F97-AD57-4C49-807A-B41839191F74\",\"name\":\"Warning\",\"rrcodes\":\"resolution.MCS_CHANGE_COMPLAINTS_STATUS_WARNING\",\"testModule\":\"MCSChangeComplaintsStatus\",\"default\":false},{\"order\":4,\"id\":\"oryx_4583A3EC-DFC8-47B9-9B04-DEE71DC3F17A\",\"name\":\"APIError\",\"rrcodes\":\"resolution.COMPLAINTS_CHANGE_STATUS_FAIL,resolution.MCS_CHANGE_COMPLAINTS_STATUS_FAIL\",\"testModule\":\"MCSChangeComplaintsStatus\",\"default\":true}]}",
它匹配以下所有表达式:

"resolution.COMPLAINTS_CHANGE_STATUS_SUCCESS
$ perl -ne 'print "$1\n" while /"resolution.(\w+)/g' file
COMPLAINTS_CHANGE_STATUS_SUCCESS
MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT
MCS_CHANGE_COMPLAINTS_STATUS_WARNING
COMPLAINTS_CHANGE_STATUS_FAIL
$ perl -ne 'print map { "$_\n" } /"resolution.(\w+)/g' 
COMPLAINTS_CHANGE_STATUS_SUCCESS
MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT
MCS_CHANGE_COMPLAINTS_STATUS_WARNING
COMPLAINTS_CHANGE_STATUS_FAIL
我已尝试打印实例捕获组:

perl -ne 'print "$1\n" if /"resolution.(\w+)/g' FILE_NAME
perl -ne 'print "$1\n" if m/"resolution.(\w+)/sig' FILE_NAME
我希望得到:

OPEN_IT_COMPLAINTS_FOUND
OPEN_IT_COMPLAINTS_NOT_FOUND
MCS_GET_COMPLAINTS_WARNING
MCS_GET_COMPLAINTS_TIMEOUT
MCS_GET_COMPLAINTS_FAIL
但我只得到:

OPEN_IT_COMPLAINTS_FOUND
如果我将上述类型的表达式放在文件中的一行中,如下所示:

\"rrcodes\":\"resolution.OPEN_IT_COMPLAINTS_NOT_FOUND1\"
\"rrcodes\":\"resolution.OPEN_IT_COMPLAINTS_NOT_FOUND2\"
\"rrcodes\":\"resolution.OPEN_IT_COMPLAINTS_NOT_FOUND2\"
\"rrcodes\":\"resolution.OPEN_IT_COMPLAINTS_NOT_FOUND4\"
我确实得到了预期的输出:

OPEN_IT_COMPLAINTS_NOT_FOUND1
OPEN_IT_COMPLAINTS_NOT_FOUND2
OPEN_IT_COMPLAINTS_NOT_FOUND2
OPEN_IT_COMPLAINTS_NOT_FOUND4

标量与列表上下文:

$perl-ne'print“$\un”foreach(/“resolution\(\w+)/g)”dummy.txt
投诉\更改\状态\成功
MCS\u更改\u投诉\u状态\u超时
MCS\u变更\u投诉\u状态\u警告
投诉\更改\状态\失败
i、 e.
/g
如果重复执行正则表达式,则仅返回多个结果。您的命令行仅执行一次匹配

也许下面的代码示例更清楚地说明了这一点

!/usr/bin/perl
严格使用;
使用警告;
我的$re=qr/字符串\.(\w+)/;
my$input=“asdlkj string.TEST1 daklkl string.TEST2 kasöldk”;
我的($scalar)=($input=~/$re/g);
打印“标量:$SCALAR\n”;
my@array=($input=~/$re/g);
打印“数组:@ARRAY\n”;
出口0;

标量与列表上下文:

$perl-ne'print“$\un”foreach(/“resolution\(\w+)/g)”dummy.txt
投诉\更改\状态\成功
MCS\u更改\u投诉\u状态\u超时
MCS\u变更\u投诉\u状态\u警告
投诉\更改\状态\失败
i、 e.
/g
仅在重复执行正则表达式时返回多个结果。您的命令行只执行了一次匹配

也许下面的代码示例更清楚地说明了这一点

#/usr/bin/perl
严格使用;
使用警告;
我的$re=qr/字符串\.(\w+)/;
my$input=“asdlkj string.TEST1 daklkl string.TEST2 kasöldk”;
我的($scalar)=($input=~/$re/g);
打印“标量:$SCALAR\n”;
my@array=($input=~/$re/g);
打印“数组:@ARRAY\n”;
出口0;

我看不到在您的输入文件中打开它

请尝试在匹配项上循环:

perl -ne 'print "$_\n" for (/"resolution.(\w+)/g)' FILE_NAME

括号为匹配项提供了一个列表上下文,for将每次为每个匹配项设置
$\u
,并在每个匹配项上调用
打印“$\n”

我看不到在输入文件中打开它

请尝试在匹配项上循环:

perl -ne 'print "$_\n" for (/"resolution.(\w+)/g)' FILE_NAME

括号为匹配项提供了一个列表上下文,for将每次设置一个匹配项,并调用
在每个匹配项上打印“$\n”

如果/../g
在标量上下文中使用正则表达式。在此上下文中,
/…/g
仅返回一个匹配项。下一个
/…/g
将返回下一个匹配项等:

$ perl -ne '
   print "$1\n" if /"resolution.(\w+)/g; 
   print "$1\n" if /"resolution.(\w+)/g;' file
COMPLAINTS_CHANGE_STATUS_SUCCESS
MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT
如果您想要所有匹配,您必须在标量上下文中重复调用
/…/g
,或者在数组上下文中使用它。第一个选项如下所示:

"resolution.COMPLAINTS_CHANGE_STATUS_SUCCESS
$ perl -ne 'print "$1\n" while /"resolution.(\w+)/g' file
COMPLAINTS_CHANGE_STATUS_SUCCESS
MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT
MCS_CHANGE_COMPLAINTS_STATUS_WARNING
COMPLAINTS_CHANGE_STATUS_FAIL
$ perl -ne 'print map { "$_\n" } /"resolution.(\w+)/g' 
COMPLAINTS_CHANGE_STATUS_SUCCESS
MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT
MCS_CHANGE_COMPLAINTS_STATUS_WARNING
COMPLAINTS_CHANGE_STATUS_FAIL
在数组上下文中,
/…/g
以数组的形式一次返回所有匹配项,即

@matches = /"resolution.(\w+)/
在某些命令行语句中,这可能如下所示:

"resolution.COMPLAINTS_CHANGE_STATUS_SUCCESS
$ perl -ne 'print "$1\n" while /"resolution.(\w+)/g' file
COMPLAINTS_CHANGE_STATUS_SUCCESS
MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT
MCS_CHANGE_COMPLAINTS_STATUS_WARNING
COMPLAINTS_CHANGE_STATUS_FAIL
$ perl -ne 'print map { "$_\n" } /"resolution.(\w+)/g' 
COMPLAINTS_CHANGE_STATUS_SUCCESS
MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT
MCS_CHANGE_COMPLAINTS_STATUS_WARNING
COMPLAINTS_CHANGE_STATUS_FAIL

如果/../g
在标量上下文中使用正则表达式。在此上下文中,
/…/g
仅返回一个匹配项。下一个
/…/g
将返回下一个匹配项等:

$ perl -ne '
   print "$1\n" if /"resolution.(\w+)/g; 
   print "$1\n" if /"resolution.(\w+)/g;' file
COMPLAINTS_CHANGE_STATUS_SUCCESS
MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT
如果您想要所有匹配,您必须在标量上下文中重复调用
/…/g
,或者在数组上下文中使用它。第一个选项如下所示:

"resolution.COMPLAINTS_CHANGE_STATUS_SUCCESS
$ perl -ne 'print "$1\n" while /"resolution.(\w+)/g' file
COMPLAINTS_CHANGE_STATUS_SUCCESS
MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT
MCS_CHANGE_COMPLAINTS_STATUS_WARNING
COMPLAINTS_CHANGE_STATUS_FAIL
$ perl -ne 'print map { "$_\n" } /"resolution.(\w+)/g' 
COMPLAINTS_CHANGE_STATUS_SUCCESS
MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT
MCS_CHANGE_COMPLAINTS_STATUS_WARNING
COMPLAINTS_CHANGE_STATUS_FAIL
在数组上下文中,
/…/g
以数组的形式一次返回所有匹配项,即

@matches = /"resolution.(\w+)/
在某些命令行语句中,这可能如下所示:

"resolution.COMPLAINTS_CHANGE_STATUS_SUCCESS
$ perl -ne 'print "$1\n" while /"resolution.(\w+)/g' file
COMPLAINTS_CHANGE_STATUS_SUCCESS
MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT
MCS_CHANGE_COMPLAINTS_STATUS_WARNING
COMPLAINTS_CHANGE_STATUS_FAIL
$ perl -ne 'print map { "$_\n" } /"resolution.(\w+)/g' 
COMPLAINTS_CHANGE_STATUS_SUCCESS
MCS_CHANGE_COMPLAINTS_STATUS_TIMEOUT
MCS_CHANGE_COMPLAINTS_STATUS_WARNING
COMPLAINTS_CHANGE_STATUS_FAIL

这很容易。只需将所有匹配项保存在数组@x中:

perl-ne'say join“\n”、@x if@x=/\”解析。(\w+/g'FILE\u NAME


@如果x不是空的,则x将被计算为真。

这很简单。只需将所有匹配项保存在数组@x中:

perl-ne'say join“\n”、@x if@x=/\”解析。(\w+/g'FILE\u NAME


@如果x不为空,则将(通过
if
)计算x为真。

每个输入行执行一次迭代。没有任何东西可以循环行中的所有匹配项。
perl-ne'print“$1\n”表示(/”分辨率。(\w+)/g)'FILE_NAME
即JSON。使用适当的、现有的JSON解析器,即使是在一行中。它将更简单、更干净、更可靠,而且几乎不再存在。我否决了甚至没有提到这一点的答案。
-n
选项对每一输入行执行一次迭代。您没有任何东西可以循环行中的所有匹配项。
perl-ne为(/“分辨率(\w+)/g)”文件名打印“$1\n”,即JSON。使用适当的现有JSON解析器,即使是在一行程序中。它将变得更简单、更清洁、更可靠,而且几乎不再如此。我否决了那些甚至没有提到这一点的答案。非常感谢Steffen。这个:perl-ne'print“$1\n”while/”分辨率。(\w+)/g'文件工作得很好。非常感谢Steffen。这个:perl-ne'print“$1\n”while/”分辨率。(\w+)/g'文件工作得很好。谢谢Stefan。这个:perl-ne'print“$\n”foreach(/“resolution\(\w+)/g)”dummy.txt成功了。谢谢Stefan。这个:perl-ne'print“$\n”foreach(/“resolution\(\w+)/g)”dummy.txt成功了。我更喜欢这样一个可以保存for循环的解决方案(只要可能)。我更喜欢这样一个可以保存for循环的解决方案(只要可能)。