2010-09-21 12 views
27

我最近發現我沒有使用正則表達式正確地在我的代碼中。以製表符分隔字符串str爲例,我一直在使用str.split("\t")。現在我意識到這是錯誤的,要正確匹配標籤,我應該使用str.split("\\t")瞭解Java中的正則表達式:split(「 t」)vs split(「\ t」) - 它們什麼時候工作,什麼時候應該使用

但是我碰巧偶然發現了這個事實,因爲我正在尋找其他東西的正則表達式。你看,故障代碼split("\t")已經在我的情況一直相當精細,現在我很困惑,如果是申報正則表達式匹配的製表符的錯誤的方式,爲什麼它的工作。因此,爲了真正理解正則表達式是如何在Java中處理的,而不是僅僅將代碼複製到Eclipse中,並且不真正在乎它爲什麼會起作用......

以類似的方式,我遇到了一塊文本不僅以製表符分隔,而且還以逗號分隔。更明確提出,製表符分隔的名單,我有時解析包括「複合型」的項目看起來像:item1,item2,item3,我想向他們解析爲單獨的元件,爲了簡單起見。在這種情況下,正確的正則表達式應該是:line.split("[\\t,]"),還是我在這裏弄錯了?

由於提前,

+0

所以你的名單既標籤,並用逗號隔開,但有時標籤是不分離? – Gumbo 2010-09-21 16:54:56

+0

好吧......沒有。它是一個以製表符分隔的標識符列表,但是在元素之間有一些由逗號分隔的id.s /的對/三元組。請參閱:http://www.pathwaycommons.org/pc/webservice.do?version=2.0&cmd=get_record_by_cpath_id&q=767212&output=gsea&output_id_type=UNIPROT – posdef 2010-09-22 08:30:51

+0

此問題與答案也相關且有幫助。檢查他們[https://stackoverflow.com/questions/1635764/string-parsing-in-java-with-delimeter-tab-t-using-split](here) – Bouramas 2017-12-05 12:56:41

回答

37

當使用"\t",所述escape sequence\t由爪哇替換爲字符U + 0009。當使用"\\t"時,\\t中的轉義序列\\被Java替換爲\,導致\t,然後regular expression解析器將其解釋爲字符U + 0009。

所以這兩種寫法會被正確地解釋。這只是當它被相應的字符替換時的問題。

+0

所以如何被認爲是「錯誤」使用split(「\ t」)用於解析製表符分隔的字符串? – posdef 2010-09-21 16:44:35

+0

@posdef是嗎? \ t製表符('\ u0009')是oracle引用告訴你的選項卡正則表達式。請參閱http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html#sum – InsertNickHere 2010-09-21 18:42:55

+2

@InsertNickHere - 實際上,oracle引用告訴您在中使用'\ t'一個字符串。如果這個字符串用文字給,你需要將反斜槓翻一番,看隨後的段落:http://download.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html #BS但參考還告訴你可以用'x'字符'x'所以它是沒有錯的用「\ t」的或「\ u0009」 – 2010-09-21 19:17:22

0

\被認爲是java中的轉義字符,所以要得到正確的正則表達式,你需要跳過\\和t來指示標籤。

This教程將幫助更多

+0

感謝您的回覆,儘管我認爲您應該再次閱讀原始問題......我已經說過,我已經學會了正確的方式來獲取正則表達式,並逃避。我的問題是爲什麼「錯誤」的正則表達式仍然有效。順便說一下,我在閱讀教程之後發佈了問題... – posdef 2010-09-21 16:42:22

+1

Java有逃逸字符以指示一些特殊字符,例如新行,反斜槓,標籤等等。(\\ t == \ t)和(\ t = tab char)。但我不確定內部正則表達式如何處理標籤。 – 2010-09-22 05:20:13

相關問題