Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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_File_Perl - Fatal编程技术网

Regex Perl正则表达式单行文件

Regex Perl正则表达式单行文件,regex,file,perl,Regex,File,Perl,我使用cat获取文件的内容,然后使用regex获取我想要的内容。当我在示例中更改if的顺序时,我将密码作为第二个密码,IP将为空 #/usr/bin/perl my$param=$ARGV[0]; 我的$IP; 我的$PASSWORD; 我的$MODEM; my@cat=`cat文件`; foreach我的$line(@cat){ 如果($line=~/$param/){ 如果($line=~/MODEM:(\w+)/g){$MODEM=$1;} 如果($line=~/IP:((\d{1,3}\

我使用cat获取文件的内容,然后使用regex获取我想要的内容。当我在示例中更改if的顺序时,我将密码作为第二个密码,IP将为空

#/usr/bin/perl
my$param=$ARGV[0];
我的$IP;
我的$PASSWORD;
我的$MODEM;
my@cat=`cat文件`;
foreach我的$line(@cat){
如果($line=~/$param/){
如果($line=~/MODEM:(\w+)/g){$MODEM=$1;}
如果($line=~/IP:((\d{1,3}\){3}\d{1,3})/g){$IP=$1;}
如果($line=~/PASSWORD:(.+)/g){$PASSWORD=$1;}
打印$MODEM;
打印$IP;
打印$PASSWORD;
}
}
文件内容(数据更改为假值):

MODEM:SOMETHING ID:1000018 MAC:606060 ID2:123499 IP:1.1.1密码:pass123
预期结果是:

SOMETHING1.1.1.1pass123
但当我将代码行更改为:

如果($line=~/MODEM:(\w+)/g){$MODEM=$1;}
如果($line=~/PASSWORD:(.+)/g){$PASSWORD=$1;}
如果($line=~/IP:((\d{1,3}\){3}\d{1,3})/g){$IP=$1;}
结果是:

SOMETHINGpass123
i、 e.IP为空。有人能解释一下为什么会发生这种情况吗?

编辑:您可能并不真的想使用3个复杂的正则表达式来解析您的文件。看看有没有更好的办法

您需要删除
/g
修改器

/g
相同字符串的连续匹配从上一个匹配的结尾开始。查看中的相关段落。
在您的文件中,
MODEM
首先出现,然后是
IP
,然后是
PASSWORD
。这意味着在匹配
/PASSWORD:(.+)/g
之后,您无法匹配字符串前面的
/IP/g


/g
修饰符在您想要执行以下操作时非常有用

while ($string =~ /.../g) { ... }
当然,在列表上下文中,要获取所有匹配项:

 @matches = $string =~ /.../g

在您的情况下,您只想一个接一个地获得不同的匹配,因此无需使用
/g
修饰符。

可能不是您想要的答案,但对于结构化数据,IMHO可能有一种比regex更简单的方法:

  • 在空白处拆分以访问字段

  • 每个字段的形式都是
    :我不知道Perl正则表达式的限制,但您可能想看看这个Regex101演示:如果(/…/g)
    ,不要使用
    ;这没有什么意义,我建议把整批货选成散列,作为替代方法<代码>我的%lookup=
    cat文件`=~m/(\w+):(\S+)/g;`这将引出关键值。@Sobrique确实,这听起来更合理