[英]Perl regex to extract multiple matches from string
例如我有一個字符串
id:123,createdby:'testuser1',"lastmodifiedby":'testuser2'.....
我想提取 2 個用戶名(testuser1、testuser2)並將其保存到一個數組中。
您不需要以一種模式執行所有操作。 在多場比賽中做一些簡單的事情:
my $string = qq(id:123,createdby:'testuser1',"lastmodifiedby":'testuser2');
my( $created_by ) = $string =~ /,createdby:'(.*?)'/;
my( $last_modified_by ) = $string =~ /,"lastmodifiedby":'(.*?)'/;
print <<"HERE";
Created: $created_by
Last modified by: $last_modified_by
HERE
但是,這看起來像是逗號分隔的數據,並且您顯示的數據引用不一致。 我不知道那是你輸入的還是你的實際數據。
但是,它看起來也可能來自 JSON。 沒錯,有更好的方法來提取數據。
試試這個
use strict;
use warnings;
my $string = q[id:123,createdby:'testuser1',"lastmodifiedby":'testuser2'....];
my @matches = ($string =~ /,createdby:'(.+?)',"lastmodifiedby":'(.+?)'/) ;
print " @matches\n";
產出
testuser1 testuser2
用戶要求更改為允許處理丟失的文件。 要解決這個問題,試試這個
use strict;
use warnings;
my $string1 = q[id:123,createdby:'testuser1',"lastmodifiedby":'testuser2'....];
my $string2 = q[id:123,createdby:'testuser1'....] ;
for my $s ($string1, $string2)
{
my @matches = ( $s =~ /(?:createdby|"lastmodifiedby"):'(.+?)'/g ) ;
print "@matches\n";
}
產出
testuser1 testuser2
testuser1
問題描述不夠詳細,里面的字符串引用不一致。
如前所述,字符串可以是 JSON 塊的一部分,在這種情況下應通過其他方式處理。 也許這個假設是正確的,但問題中沒有明確說明。
請閱讀我如何提出一個好問題? ,如何創建最小的、可重現的示例。
否則假設引用只是一個打字錯誤。 更大的數據樣本和更好的問題描述將是問題的重大改進。
以下代碼示例演示了獲得所需結果的一種可能方法,並假設數據字段不包括,
和:
(否則必須采用其他處理數據的方法)。
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
my($str,%data,@arr);
$str = "id:123,createdby:'testuser1','lastmodifiedby':'testuser2'";
$str =~ s/'//g;
%data = split(/[:,]/,$str);
say Dumper(\%data);
@arr = ($data{createdby},$data{lastmodifiedby});
say Dumper(\@arr);
輸出
$VAR1 = {
'id' => '123',
'createdby' => 'testuser1',
'lastmodifiedby' => 'testuser2'
};
$VAR1 = [
'testuser1',
'testuser2'
];
其他方法可能如下
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
my($str,$re,@data,@arr);
$str = "id:123,createdby:'testuser1',\"lastmodifiedby\":'testuser2'";
@data = split(',',$str);
$re = qr/(createdby|lastmodifiedby)/;
for ( @data ) {
next unless /$re/;
s/['"]//g;
my($k,$v) = split(':',$_);
push @arr, $v;
}
say Dumper(\@arr);
輸出
$VAR1 = [
'testuser1',
'testuser2'
];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.