2013-08-18 59 views
-1

的代碼正則表達式的代碼正則表達式的優點是什麼?

String inpuTwo = "cat cat cat cattie cat"; 
    int lastIndex = 0; 
    int count = 0; 
    while (lastIndex != -1) { 
     lastIndex = inpuTwo.indexOf("cat", lastIndex); 
     if (lastIndex != -1) { 
      count++; 
      lastIndex += findStr.length(); 
     } 
    } 
    System.out.println("Match number " + count); 

在既會確實發現在輸入字符串「貓貓貓cattie貓」串「貓」的出現

String inputOne = "cat cat cat cattie cat"; 
    String findStr = "cat"; 
    Pattern p = Pattern.compile("cat"); 
    Matcher m = p.matcher(inputOne); 
    int countOne = 0; 
    while (m.find()) { 
     countOne++; 
    } 
    System.out.println("Match number " + countOne); 

字符串比較。

我的問題是他們之間有什麼不同?

正則表達式比字符串比較有什麼優勢。

哪一個我應該用於應用程序。正則表達式還是字符串比較?

謝謝。

+3

這是短暫和consise。 – arynaq

+0

如果您必須在字符串中找到電子郵件地址,您會做什麼?你可能會爭辯說你可以找到'@'的事件。但是,即使在電子郵件地址的上下文之外,「@」也可能發生。它會變得複雜,直到你可以找到一個正則表達式來解決問題。 – adarshr

+0

@adarshr假設迭代字符並檢查標誌,檢查某些字符(如@)是否已匹配。並不是說它是一個好主意。 – hexafraction

回答

13

這兩者完全不同,所以答案很大程度上取決於手頭的任務。

如果使用正則表達式而不使用metacharacters,請使用基於字符串的比較:它們更容易理解,並且不會在不屬於它的地方引入複雜性(here is a link to an article that explores this point in depth)。

正則表達式的威力從使用元字符開始。如果您需要定義要捕獲的字符串而不是逐個枚舉它們,則應使用正則表達式。

+0

正則表達式將在內部使用字符串比較。 – Prabhakaran

+3

@Prabhakaran最有可能的是,否:正則表達式引擎通常會建立識別輸入的最終狀態自動機。在Java中,該自動機的構建發生在對「Pattern.compile」的調用中。 – dasblinkenlight

+0

@Prabhakaran通過「基於字符串的比較」,我的意思是「indeOf」,「replace」等將字符串解釋爲字符序列的各種方法(而不是像replaceAll和'split(String)',它將字符串解釋爲正則表達式)。 – dasblinkenlight

1

當內置功能不足以滿足特定場景時正則表達式很有用,例如我們正在研究複雜的事情。但有些情況下,我們可以使用內置函數或正則表達式。同樣使用正則表達式會縮短代碼並有效,但會降低我認爲的代碼的可讀性。

+0

Thanx @ruchira。 – Prabhakaran

3

在你的例子中,沒有問題。正則表達式有一點更清晰,但不顯着。

正則表達式的真正優點來自當你需要做更復雜的事情時。例如,如何編寫非正則表達式代碼來查找連續兩位數的次數? (你可以,但它會更長的代碼和更難閱讀)

正則表達式將是「\ d \ d」。在沒有正則表達式的情況下寫這個會需要很多if語句。

+1

\ d {2}也可以工作,並且可讀性更高。 – JDiPierro

+1

我將{n}用於三個或更多。個人喜好。我想因爲\ d \ d是一個字符較短。 –

+0

Thanx @ jeanne-boyarsky – Prabhakaran

4

你給出的例子是INCREDIBLY基本的。也許正則表達式對於這種情況並不是最好的答案。正則表達式有很多用途。我在ETL工作中使用了很多正則表達式,我試圖識別一條信息並將其提取出來。我經常會混淆lookbehinds,捕獲組和字符集。使用高級正則表達式比編程方式更容易。

一個例子是,我的一個朋友需要一個正則表達式,從字符串中獲得有效的金額,不管他們是否有逗號。以及他們是否只有三個時纔會這樣做。我寫的正則表達式是:

(< = \ $?)\ d {1,3}(\ d {3}?)* \ d {2}(\ d?!)。

(?<=\$)是一個積極向後看。這是說$必須在主要比賽之前,但不包括在內。

\d{1,3}正在尋找從1到3個數字的任何地方。

,?與逗號相匹配,但使其成爲可選項。

\d{3}又是3個數字。

*中的所有內容與該序列中的0個或更多匹配後,將其全部組合到一起。

\.\d{2}(?!\d)確保我們有美分,但只有2位數的價值。 (?!\d)是負向前視,意味着在主要匹配之後不能有另一個數字。如果有的話使比賽無效。

這個正則表達式很難以編程方式編寫,而且會花費很多時間。使用正則表達式可以節省時間,並且,如果您瞭解正則表達式,可以更輕鬆地查看發生的事情。

此正則表達式匹配的東西,如:

$ 1,000,000.00和$ 100000.00臺

但是不匹配是這樣的:

$ 1,00,000.00或$ 1000.000

然後逗號可以剝離出來的匹配值,然後您可以將其解析爲數字數據類型。

+0

Thanx @jdipierro – Prabhakaran