Regex 正则表达式获取字符串,直到Perl中的某个字符串

Regex 正则表达式获取字符串,直到Perl中的某个字符串,regex,perl,Regex,Perl,我有一个字符串,我想使用正则表达式提取字符串的某些部分 下面是我的脚本。我能够得到预期的输出。但我们需要知道,我们是否有其他方法来实现这一目标 #!/usr/bin/perl use strict; use warnings; my $str = "Network=ABC,Network=10,Node=N360,Slot=3,Unit=R1,Group=RU,DeviceSet=1,Device=2"; if($str =~ m/(.*),Device/){

我有一个字符串,我想使用正则表达式提取字符串的某些部分

下面是我的脚本。我能够得到预期的输出。但我们需要知道,我们是否有其他方法来实现这一目标

#!/usr/bin/perl

use strict; use warnings;

my $str = "Network=ABC,Network=10,Node=N360,Slot=3,Unit=R1,Group=RU,DeviceSet=1,Device=2";

if($str =~ m/(.*),Device/){
    print "Out: $1";
} else {
    print "Not matching";
}

如果字符串末尾包含
Device=
,则它不应打印
Device=
,其余应打印的内容。我使用
(.*)
表达式执行此操作。除此之外,我们还有其他选择吗?

我会这样处理:

#!/usr/bin/perl

use strict; 
use warnings;

use Data::Dumper;

my $str = "Network=ABC,Network=10,Node=N360,Slot=3,Unit=R1,Group=RU,DeviceSet=1,Device=2";

my @field_order = ( $str =~ m/(\w+)=/g);
my %value_of = ($str =~ m/(\w+)=(\w+)/g);

print Dumper \%value_of;

print "Contains Device of $value_of{'Device'}\n" if defined $value_of{'Device'};

pop ( @field_order ) if ( $field_order[-1] eq "Device" ); #discard trailing 'Device' field. 

print Dumper \@field_order;


#Splice together your hash, without including 'Device' on the end. 
print join ",", map { $_ . "=". $value_of{$_}  } @field_order;

在执行此操作时,您可以将字符串解析为数据结构,并可以使用单独的键和值,

我将这样处理它:

#!/usr/bin/perl

use strict; 
use warnings;

use Data::Dumper;

my $str = "Network=ABC,Network=10,Node=N360,Slot=3,Unit=R1,Group=RU,DeviceSet=1,Device=2";

my @field_order = ( $str =~ m/(\w+)=/g);
my %value_of = ($str =~ m/(\w+)=(\w+)/g);

print Dumper \%value_of;

print "Contains Device of $value_of{'Device'}\n" if defined $value_of{'Device'};

pop ( @field_order ) if ( $field_order[-1] eq "Device" ); #discard trailing 'Device' field. 

print Dumper \@field_order;


#Splice together your hash, without including 'Device' on the end. 
print join ",", map { $_ . "=". $value_of{$_}  } @field_order;

在执行此操作时,您可以将字符串解析为数据结构,并可以使用单独的键和值,

如果您只想删除字符串中的任何位置(包括末尾),您可以使用此替换:

my $str = "Network=ABC,Network=10,Node=N360,Slot=3,Unit=R1,Group=RU,DeviceSet=1,Device=2";
$str =~ s/,Device=\d+//;
# result: "Network=ABC,Network=10,Node=N360,Slot=3,Unit=R1,Group=RU,DeviceSet=1"
说明:

  • 搜索:
    ,设备=\d+
  • 替换:(清空,例如,移除火柴)
这个正则表达式更具防御性。但是,如果您只想在末尾删除模式,请在正则表达式中附加一个
$

$str =~ s/,Device=\d+$//;

如果只想删除字符串中的任何位置(包括末尾),可以使用以下替换:

my $str = "Network=ABC,Network=10,Node=N360,Slot=3,Unit=R1,Group=RU,DeviceSet=1,Device=2";
$str =~ s/,Device=\d+//;
# result: "Network=ABC,Network=10,Node=N360,Slot=3,Unit=R1,Group=RU,DeviceSet=1"
说明:

  • 搜索:
    ,设备=\d+
  • 替换:(清空,例如,移除火柴)
这个正则表达式更具防御性。但是,如果您只想在末尾删除模式,请在正则表达式中附加一个
$

$str =~ s/,Device=\d+$//;

可能会有帮助

    if($str =~ m/(.*?)\,Device\b/){
       print "Out: $1";
    } else {
       print "Not matching";
    }

在这里,(.*)将找到设备字的第一组字符串。此外,我们需要为单词设置边界。

这可能会有所帮助

    if($str =~ m/(.*?)\,Device\b/){
       print "Out: $1";
    } else {
       print "Not matching";
    }

在这里,(.*)将找到设备字的第一组字符串。此外,我们还需要设置单词的边界。

首先,您的图案是否与您想要的图案匹配?您希望在末尾找到
Device=
。但你的模式不是这样的。您不包括有关数字或行尾的信息。锚在这些情况下很重要:

 /
 ,       # Start of final field to anchor this to a whole column
 Device
 =
 [0-9]
 $       # end of line
 /x
第二,替换操作告诉您它进行的替换的数量。如果它进行了替换,则这是您想要的行,因此打印修改后的行:

if( $var =~ s/.../\n/ ) {
   print $var
   }
else {
   print "No match\n";
   }

首先,您的模式是否真正符合您的要求?您希望在末尾找到
Device=
。但你的模式不是这样的。您不包括有关数字或行尾的信息。锚在这些情况下很重要:

 /
 ,       # Start of final field to anchor this to a whole column
 Device
 =
 [0-9]
 $       # end of line
 /x
第二,替换操作告诉您它进行的替换的数量。如果它进行了替换,则这是您想要的行,因此打印修改后的行:

if( $var =~ s/.../\n/ ) {
   print $var
   }
else {
   print "No match\n";
   }


您可以尝试替换,即
s/,Device=.*/您的那些字符串实际上是逗号分隔的键/值对。最正确的解决方案可能不是尝试将它们解析为字符串,而是将它们解析为CSV。@TLP:在整个字符串中的值之间不可能有逗号(
)。所以我可以使用字符串匹配。您可以尝试替换,即,
s/,Device=.*/您的那些字符串实际上是逗号分隔的键/值对。最正确的解决方案可能不是尝试将它们解析为字符串,而是将它们解析为CSV。@TLP:在整个字符串中的值之间不可能有逗号(
)。这样我就可以进行字符串匹配了。在字符串的末尾(而不是其他地方)放置一个锚,这样它就匹配了,你就解决了他的部分问题。@briandfoy:事实上,我并没有故意添加锚,以防
设备=
不在端井,这不是他想要的。他特别说“最后”。如果不是在最后,那么您需要对所有的CSV进行适当的处理。@briandfoy:是的,将rgex更改为
s/,Device=\d+$/
以使其更具限制性是很简单的。对于防御性编码,我会减少它的限制性。请注意,您也会说“在末尾”,但这不是您所做的或您在注释中所说的。请将其放在锚点上,以便它与字符串的末尾匹配(而不是其他任何地方)你已经解决了他的部分问题。@briandfoy:事实上,我并没有故意添加锚,以防
设备=
不在端井,这不是他想要的。他特别说“最后”。如果不是在最后,那么您需要对所有的CSV进行适当的处理。@briandfoy:是的,将rgex更改为
s/,Device=\d+$/
以使其更具限制性是很简单的。对于防御性编码,我会减少限制性。请注意,您也会说“在结尾”,但这不是您所做的,也不是您在注释中所说的。字符串开头这样的非贪婪匹配无助于您解决此问题。匹配
\,设备\b
已经可以让您找到该设备的第一个实例。但是,请注意,您需要在字符串的末尾进行匹配,而不仅仅是在单词边界,我尝试了这个方法并进行了验证。它不会在DeviceSet中停止。字符串开头这样的非贪婪匹配无助于解决此问题。匹配
\,设备\b
已经可以让您找到该设备的第一个实例。但是,请注意,您需要在字符串的末尾进行匹配,而不仅仅是在单词边界,我尝试了这个方法并进行了验证。它不会在设备集中停止。