簡體   English   中英

Perl-正則表達式中的“]”問題

[英]Perl - Problem with “]” in a regular expression

我有一個字符串:

my $string = "name_of_my_function(arg1,arg2,[arg3,arg4])";

並且我想提取函數“ name_of_my_function”的名稱和參數:

$arg1 = "arg1"
$arg2 = "arg2"
@arg_list = ("arg3", "arg4")

我用來提取函數的代碼是:

$row =~ m/^([^\(]*)\(([^\)]*)\)/;
$function = $1;

但是,當字符串沒有任何"]"時,它可以工作,例如:

my $string = "name_of_my_function(arg1,arg2,arg3)";

但是當有"]"時它不返回任何內容

任何想法?

謝謝,

SLP

您顯示的正則表達式捕獲函數名以及字符串中的所有其他參數,這是非常合理的第一步。 然后從第二個字符串中解析出參數。 我將$string擴展為具有多個括號中的參數列表,並與非括號中的參數交織在一起

perl -wE'
    $s = "name_of_my_function(arg1,arg2,[arg3,arg4],arg5,[arg6,arg7])"; 
    @m = $s =~ /^([^\(]*)\(([^\)]*)\)/; 
    @p = grep { $_ } split /\s*,\s*|\[(.*?)\]/, $m[1];
    for (@p) { 
        if (/,/) { push @arg_list, $_ }
        else     { push @args, $_ }
    }
    say $m[0];
    say for @args; 
    say for @arg_list
'

此打印

name_of_my_function
arg1
arg2
arg5
arg3,arg4
arg6,arg7

split是提取單個參數以及括號中的參數列表(每個參數都作為字符串)的位置。 這可能會返回空元素,因此grep { $_ }會將其過濾掉。

然后你就可以繼續和已經在括號中列出提取單個參數,通過分割每個字符串@arg_list通過,再次。


問題而言,以上內容的主要部分可以一言以蔽之

@p = grep { $_ } split /\( | \) | \[(.*?)\] |,/x, $s;

我在其中添加了/x修飾符,以便能夠將其隔開以提高可讀性。 這會向@p提供函數名稱,單個參數以及每個[]帶有(逗號分隔)參數列表的字符串。

但是,我認為將其分解為幾個步驟更為明智。

好吧,如果參數的數量是可變的,那么僅使用rgex進行操作就不是那么簡單(參數將與+量詞匹配,因此它們不會存儲在捕獲組中,這很容易提取)。 考慮到上述情況,可以使用此模式(\\w+)\\(((\\w+|\\[(\\w+,?)+\\]),?)+\\)

說明:

(\\w+) -匹配一個或多個單詞字符(函數名稱)並將其存儲在第一個捕獲組中,

(\\w+|\\[(\\w+,?)+\\]) -交替:匹配\\w+ (與上述相同)或\\[(\\w+,?)+\\]\\[ -匹配[字面意義上, (\\w+,?)+ -匹配一次或多次\\w+,模式是一個或多個單詞字符,后跟一個或零個逗號( ,? ), \\] -從字面上匹配]

((\\w+|\\[(\\w+,?)+\\]),?)+ -匹配整個上述模式,並可選地跟着逗號( ,? )一次或多次。 這將匹配參數列表。

\\(\\) 0匹配()

進一步處理-提取方括號()之間的內容,以便以編程方式提取參數列表-使用復雜的正則表達式會更容易

演示版

更新

嘗試模式: https://regex101.com/r/wBcJZ0/3https://regex101.com/r/wBcJZ0/3

我省略了解釋,因為它與以前的模式非常相似。

更新的演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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