给定一个包含表示专有名词和类别/描述对的逗号分隔列表的字符串,使用 String.split() 与 Pattern & Matcher 方法查找特定专有名词并提取相关类别的优缺点是什么/描述对?
haystack 字符串格式不会改变。它将始终包含以下形式的逗号分隔数据 PROPER_NOUN|类别/描述
两种方法的共同变量:
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 & Matcher,所以这种方法需要从 java.util.regex
导入当然,如果有客观“更好”的方法来解析信息,我将欢迎您提出意见。
感谢您的宝贵时间!
结论
我选择了模式/匹配器方法。虽然使用正则表达式阅读起来有点棘手,但它比 .split()/.contains()/.split() 更快,而且对我来说更重要的是,它只捕获第一个匹配项。
就其值(value)而言,这是我不完美的基准测试的结果,以纳秒为单位,经过 100,000 次迭代:
.split()/.contains()/.split
304,212,973
为每次迭代调用 Pattern.compile() 的 Pattern/Matcher
230,511,000
Pattern/Matcher w/Pattern.compile() 在迭代之前调用
111,545,646
最佳答案
在像这样的小案例中,这无关紧要。但是,如果您有非常大的字符串,直接使用 Pattern/Matcher 可能会有好处。
大多数使用正则表达式的字符串函数(例如 matches()、split()、replaceAll() 等)直接使用 Matcher/Pattern。因此每次都会创建一个Matcher对象,在大循环中使用会导致效率低下。
因此,如果您真的想要速度,可以直接使用 Matcher/Pattern,理想情况下只创建一个 Matcher 对象。
关于Java - 解析字符串 - String.split() 与 Pattern 和 Matcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24813430/