2013-11-20 57 views
-1

下面的代碼Perl可選?停止變量捕獲

my $regex = '^.*?"blocked"\s+:\s+true.*?"clientip"\s+:\s+"([^"]*)".*?"containsadverts" : false.*?"destdomain" :\s+"([^"]*).*?("username" :\s+{ ")?([^"]*)?.*$'; 

的(相當大的)字符串匹配它有時會:

"username" : { "John" : [ ] } } 

有時不是。當它發生時,我需要獲取名爲$ 4的名字(在這種情況下爲John)。 我的想法是創建兩個捕獲組,然後添加?在每個結束時使它們成爲可選項。

這導致:

Use of uninitialized value $3 in concatenation (.) or string at perl_regex.pl line 13. 

當我刪除了?在每年年底捕捉這將捕捉到的變量確定,但在「用戶名」不存在正則表達式失敗。我在想,?正在做一些我可能不太瞭解的事情?

+2

該錯誤不是來自該行代碼。這實際上是不可能的,因爲單引號字符串不會插入變量。 – TLP

+0

'perldoc perlre' ...考慮對複雜正則表達式使用'// x'修飾符 – toolic

+1

另外,當然,這不是*正則表達式,它是一個字符串。雖然它是單引號的,但它不會像正則表達式那樣行事,並且是潛在的難以發現錯誤的來源。你應該使用'qr()'來存儲一個正則表達式。當然,正如mpapec所說,如果這是JSON,你應該使用JSON模塊解析它,絕對*不*使用正則表達式。 – TLP

回答

3

您可以使用JSON模塊作爲正則表達式不適合這項工作的正確工具。