Java - 解析字符串 - String.split() 与 Pattern 和 Matcher

标签 java regex parsing

给定一个包含表示专有名词和类别/描述对的逗号分隔列表的字符串,使用 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/

相关文章:

python - 检查列表中的单词并删除 pandas dataframe 列中的那些单词

javascript - 如何通过Java解析器现场触发jQuery脚本

python - 使用 Beautiful Soup 4 一次搜索多种标签

parsing - 将字符串转换为 HashMap 的最简单方法

java - 在 stringtemplate v4 中实现自定义函数

javascript - Terser RegExp 捕捉分组词的备选集合

java - 如何从谷歌翻译短语手册中获取单词?

php - 正则表达式不匹配模式数组

java - 等待两个 ExecutorServices 的首选方式?

java - Fragment 中的 TableLayout