我正在将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脚本执行正常。
答案 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("([^\\[]+)\\[([^\\]]+)\\]");