给定一个包含逗号分隔列表的字符串,该列表表示专有名词&类别/描述对,什么是优点和使用String.split()对比Pattern&匹配方法找到一个特定的专有名词并提取相关的类别/描述对?
haystack 字符串格式不会更改。它将始终包含逗号分隔数据的形式 PROPER_NOUN | CATEGORY /描述
两种方法的常见变量:
String haystack="EARTH|PLANET/COMFORTABLE,MARS|PLANET/HARDTOBREATHE,PLUTO|DWARF_PLANET/FARAWAY";
String needle="PLUTO";
String result=null;
使用String.split():
for (String current : haystack.split(","))
if (current.contains(needle))
{
result=current.split("\\|")[1]);
break; // *edit* Not part of original code - added in response to comment from Pshemo
{
使用模式&匹配器:
Pattern pattern = pattern.compile("(" +needle+ "\|)(\w+/\w+)");
Matcher matches = pattern.matcher(haystack);
if (matches.find())
result=matches.group(2);
这两种方法都提供了我需要的信息。
我想知道是否有任何理由选择一个而不是另一个。我目前没有使用Pattern&在我的项目中匹配,所以这种方法需要从 java.util.regex
导入当然,如果有一种客观的“更好”的方式来解析信息,我将欢迎您的意见。
感谢您的时间!
结论
我选择了Pattern / Matcher方法。虽然阅读正则表达式有点棘手,但它比.split()/。contains()/。split()更快,而且对我来说更重要的是只捕获第一个匹配。
对于它的价值,以下是我的不完美基准测试的结果,以纳秒为单位,经过100,000次迭代后:
.split()/。含有()/。分割
304212973
模式/匹配器w / Pattern.compile()为每次迭代调用
230511000
模式/匹配器w / Pattern.compile()在迭代之前调用
111545646
答案 0 :(得分:12)
在像这样的小案例中,这并不重要。但是,如果你有非常大的字符串,直接使用Pattern / Matcher可能是有益的。
大多数使用正则表达式的字符串函数(例如matches(),split(),replaceAll()等)直接使用Matcher / Pattern。因此,它每次都会创建一个Matcher对象,在大循环中使用时效率低下。
因此,如果您真的想要速度,可以直接使用Matcher / Pattern,理想情况下只创建一个Matcher对象。
答案 1 :(得分:1)
我想说split()
版本在这里要好得多,原因如下:
split()
代码非常清晰,很容易看出它的作用。正则表达式需要更多的分析。答案 2 :(得分:1)
在要完成的操作就像这样简单的情况下,使用模式/匹配器有 no 的优点。
您可以将String.split()
视为一种便捷方法,利用您在直接使用模式/匹配器时使用的许多相同功能。
当您需要进行更复杂的匹配/操作时,请使用模式/匹配器,但当String.split()
满足您的需求时,使用它的明显优势在于它大大降低了代码复杂性 - 我可以想到没有理由把这个优势传递出去。