簡體   English   中英

Java - 解析字符串 - String.split()與Pattern&Matcher

[英]Java - Parsing strings - String.split() versus Pattern & Matcher

給定一個包含逗號分隔列表的String,表示專有名詞和類別/描述對,使用String.split()與Pattern&Matcher方法找到特定專有名詞並提取相關類別/描述對的優缺點是什么? ?

haystack String格式不會改變。 它將始終包含PROPER_NOUN | CATEGORY / 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導入

當然,如果有一種客觀的“更好”的方式來解析信息,我將歡迎您的意見。

感謝您的時間!

結論

我選擇了Pattern / Matcher方法。 雖然使用正則表達式讀取有點棘手,但它比.split()/。contains()/。split()更快,而且對我來說更重要的是僅捕獲第一個匹配。

對於它的價值,以下是我在100,000次迭代后的不完美基准測試的結果,以納秒為單位:

.split()/。含有()/。分裂

304212973

模式/匹配器w / Pattern.compile()為每次迭代調用

230511000

模式/匹配器在迭代之前調用Pattern.compile()

111545646

在像這樣的小案例中,這並不重要。 但是,如果你有非常大的字符串,直接使用Pattern / Matcher可能是有益的。

大多數使用正則表達式的字符串函數(例如matches(),split(),replaceAll()等)直接使用Matcher / Pattern。 因此,它每次都會創建一個Matcher對象,在大循環中使用時效率低下。

因此,如果你真的想要速度,你可以直接使用Matcher / Pattern,理想情況下只創建一個Matcher對象。

我會說split()版本在這里要好得多,原因如下:

  • split()代碼非常清晰,很容易看出它的作用。 正則表達式版本需要更多的分析。
  • 正則表達式更復雜,因此代碼更容易出錯。

在要完成的操作就像這樣簡單的情況下使用模式/匹配器沒有任何優勢。

您可以將String.split()視為一種便捷方法,它利用您在直接使用模式/匹配器時使用的許多相同功能。

當你需要進行更復雜的匹配/操作時,使用模式/匹配器,但是當String.split()滿足你的需求時,使用它的明顯優勢是它可以大大降低代碼復雜性 - 我認為沒有充分的理由通過這個優勢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM