2013-11-20 25 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模块作为正则表达式不适合这项工作的正确工具。