多年来,我一直是一名正则表达式从业者,主要是在 perl 中,您可以在其中做一些方便的事情,例如:
my $delim = qr#[-\:/]#; # basic enough
my $field1 = qr/(\d{8})/; # basic enough
my $field2 = qr/(?:one|two|three)(\d{8,10})/; # basic enough
...
my $re = qr/$field1${delim}$field2/; # beautiful magicks
while (<>) {
/$re/ and print "$1\n";
}
关键不是你可以预编译它们,而是你可以在另一个正则表达式中使用一个作为变量来构建一个更大的复合正则表达式,它实际上是可读的。单独的部分可以使用简单的测试数据进行测试,并且复合可以是动态的(例如,$delim 可以作为参数传递给 sub)。
问题是,如何在 Java 中解决这个问题,模式/匹配器方法统治着这一天。
这是我的刺:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Pattern delim = Pattern.compile("[-\:/]");
Pattern field1 = Pattern.compile("(\d{8})");
Pattern field2 = Pattern.compile("(?:one|two|three)(\d{8,10})");
Pattern re_pat = Pattern.complle(
field1.pattern() + delim.pattern() + field2.pattern();
)
...
Matcher re = re_pat.matcher(input);
这是可靠的(有什么陷阱吗?),或者是最好的 Java 等价物吗?也可以随意回答与 Groovy 相关的问题,因为这是我编写此代码的最终目标(但似乎 Groovy 或多或少依赖于底层的 Java 正则表达式实现)。谢谢。