[英]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/3
: https://regex101.com/r/wBcJZ0/3
我省略了解釋,因為它與以前的模式非常相似。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.