2012-10-03 259 views
6

我已經開始在我的java程序中使用.match(Regex)方法,但現在我只是使用一個字符串(String regexString = new String("[^a-zA-Z0-9][^a-zA-Z0-9]*");這是迄今爲止,作爲一個例子)。我知道然而我可以使用一個實際的正則表達式(然後編譯它(?)一些如何)。用字符串表示正則表達式還是不用字符串表達正則表達式?

在java中使用Regex作爲類而不僅僅是一個字符串是否有優勢?我習慣於打腳本,而正則表達式只是最簡單的意義上的'串',並且沒有能力/需要一個單獨的類,所以我很努力地看到這裏有一個。

+2

永遠不要寫'new String(「...」);'。只需使用'「...」'而不是:'String regexString =「。*」;'。顯式創建一個新的'String'對象是沒有必要的和低效的。 – Jesper

+0

無論如何我每次都會創建一個對象?如果我有幾個單獨的字符串呢? – Pureferret

+3

是的,如果你只是使用一個文字,例如'「。*」',那麼就會創建一個String對象。但是如果你使用'new String(「。*」)',則會創建第二個String對象,它複製文字字符串的內容,這是不必要的。字符串在Java中是不可變的。 Java有一個字符串池機制,所以如果多次使用相同的字符串,將只有一個共享的String對象。 – Jesper

回答

7

我會做你認爲最簡單和最清晰的。

A Pattern通常用於正則表達式的性能至關重要。如果您還沒有對您的應用程序進行簡介,並且它已被證明是一個問題,那麼使用普通的String很可能沒問題。

+0

我已經找到的一件事是,你只能用一個字符串「匹配」,你不能'發現'這是我想要做的事情。 – Pureferret

+1

你可以匹配(「。*」+ regex +「。*」);'而不是find。 –

0

您試圖用於匹配目的的正則表達式必須在接受任何與您提供的模式相匹配的文本的有限狀態機中進行轉換。因此,每次使用正則表達式時,例如在(new String(「」)。split(「」)表達式中,都會在後臺構造一個模式,即一個有限狀態機,它接收如果你有一個經常使用的正則表達式,並且速度是一個真正的問題,那麼保持有限狀態機而不是每次構建它都是一個重要的加速比你可以通過在連續調用匹配onn不同輸出字符串之間存儲Pattern對象來做到這一點。

下面應該提供一些更多的見解:http://en.wikipedia.org/wiki/Finite-state_machine

+0

我看不到如何初始化一個字符串,該字符串被轉換成一個存儲的模式與從一個字符串初始化並存儲的模式非常不同。 – Pureferret