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
已经可以让您找到该设备的第一个实例。但是,请注意,您需要在字符串的末尾进行匹配,而不仅仅是在单词边界,我尝试了这个方法并进行了验证。它不会在设备集中停止。