簡體   English   中英

Perl 正則表達式從字符串中提取多個匹配項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM