当前位置: 首页 > 知识库问答 >
问题:

Java-解析字符串-string.split()与Pattern和Matcher的比较

寿丰
2023-03-14

给定一个包含逗号分隔列表的字符串,表示专有名词和类别/描述对,使用String.split()与模式和匹配器方法查找特定专有名词并提取相关联的类别/描述对的优缺点是什么?

haystack字符串格式不会更改。它将始终包含PROPER_NOUNCATEGORY/DESCRIPTION形式的逗号分隔数据

两种方法的共同变量:

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导入

当然,如果有客观上‘更好’的方法来解析信息,我将欢迎您的输入。

谢谢你抽出时间!

结论

我选择了模式/匹配器方法。虽然读取regex有点麻烦,但它比.split()/.contains()/.split()快,而且对我来说更重要的是,它只捕获第一个匹配。

值得的是,下面是我的不完美基准测试的结果,以纳秒为单位,经过100,000次迭代:

.split()/.contains()/.split

304,212,973

为每次迭代调用的pattern.compile()模式/匹配器

230,511,000

在迭代之前调用了带有pattern.compile()的模式/匹配器

111,545,646

共有2个答案

杜海
2023-03-14

在要进行的操作如此简单的情况下,使用模式/匹配器没有任何优点。

您可以将string.split()视为一种方便的方法,它利用了直接使用模式/匹配器时使用的许多相同功能

当您需要进行更复杂的匹配/操作时,请使用pattern/matcher,但当string.split()满足您的需要时,使用它的明显优势是它大大降低了代码复杂度--我想不出有什么好的理由可以忽略这一优势。

邵兴庆
2023-03-14

像这样的小案子,就没那么重要了。但是,如果您有特别大的字符串,那么直接使用pattern/matcher可能是有益的。

大多数使用正则表达式的字符串函数(如matches()、split()、replaceAll()等)都直接利用了matcher/pattern。因此,它每次都会创建一个Matcher对象,在大型循环中使用时会导致效率低下。

因此,如果您真的需要速度,您可以直接使用Matcher/pattern并且理想情况下只创建一个Matcher对象。

 类似资料:
  • java.util.regex 是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern 和 Matcher。 Pattern 对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译为 Pattern 对象,然后再利用该 Pattern 对象创建对应的 Matcher 对象。执行匹配所涉及的状态保留在 Matcher 对象中,多个 Match

  • 我已经声明了一个实现可比较接口和compareTo方法的类,使用employee ID比较两个员工。创建的类对象插入数组列表。现在,当我使用collections.sort(arrayList对象)时,它工作得很好。我对collective和comparator接口之间的比较有何不同感到困惑。我想知道如何在纯粹由数字组成的employee id字符串和其他字符串employee id之间进行比较,

  • 问题内容: 我想用几行代码来说明Java中要比较两个字符串(),必须使用而不是operator 。 这是我尝试过的东西: 我期待的输出是:,因为在测试中,我实际上是在比较两个引用(即地址)而不是对象的内容。 但事实上,我这样的输出:! 浏览我发现,一些Java实现将优化上述代码,以便在互联网和 将 实际引用相同的字符串。 好吧,当在Java中比较字符串(或对象)时,如何使用运算符演示问题? 问题答

  • 我将保持这个简短。我正在编写一个模块,它需要比较作为字符串输入的两个大整数(注意:它们很大,但不足以超过Int64边界)。 字符串是填充的,因此选择是采取额外的步骤将其转换为等效的整数,还是将其作为字符串进行比较。 我正在做的是将它们中的每一个都转换为Int64并以这种方式进行比较。但是,我相信字符串比较也可以工作。鉴于我希望它尽可能高效,您对通过以下方式比较整数有什么看法: 或

  • 问题内容: 在Java中执行以下操作的最佳方法是什么。我有两个输入字符串 我需要从字符串中提取类型和数字。 在这种情况下,答案是type =“ a good”和number =“ 234” 谢谢 问题答案: 您可以使用正则表达式:

  • 本文向大家介绍深入解析C++和JAVA的字符串,包括了深入解析C++和JAVA的字符串的使用技巧和注意事项,需要的朋友参考一下 所有的字符串类都起源于C语言的字符串,而C语言字符串则是字符的数组。C语言中是没有字符串的,只有字符数组。 谈一下C++的字符串:C++提供两种字符串的表示:C风格的字符串和标准C++引入的string类型。一般建议用string类型,但是实际情况中还是要使用老式C风格的