将Perl正则表达式转换为Java

时间:2018-05-03 16:45:00

标签: java regex perl

我正在将http://cpansearch.perl.org/src/DSTAAL/Mail-Log-Parse-1.0400/lib/Mail/Log/Parse/Postfix.pm转换为Java。

我正在尝试转换以下行

($line_info{previous_host_name}, $line_info{previous_host_ip})
                = $line_info{previous_host} =~ m/([^[]+)\[([^\]]+)\]/;

如果我在http://www.regexplanet.com/advanced/java/index.html的{regexp转换器页面中输入该行

Unclosed character class near index 18 ([^[]+)\[([^\]]+)\] ^

原始的perl脚本执行正常。

1 个答案:

答案 0 :(得分:1)

在Java中,你不能拥有这个:

[^[]

这是因为Java的字符类集操作使用嵌套的字符类,这看起来像是一个格式错误的类。

Operation       Perl (Experiemental)    Java             Result
------------    --------------------    -------------    --------
Union           (?[ [a-e] | [n-r] ])    [a-e[n-r]]       [a-en-r]
Intersection    (?[ [a-m] & [f-r] ])    [a-m&&[f-r]]     [f-m]
Difference      (?[ [a-r] - [f-m] ])    [a-r&&[^f-m]]    [a-en-r]

但那不是你的意思。您希望字符类的倒数只有[(即匹配除[之外的所有字符的字符类)。为此,您需要转义[

[^\[]

Java字符串文字中的全部内容:

Pattern p = Pattern.compile("([^\\[]+)\\[([^\\]]+)\\]");