2016-03-21 39 views
-1

有沒有什麼辦法在不同的Java正則表達式「分支」上設置相同字段中的值,以便後面的類似switch的語句可以識別哪個分支被跟蹤?帶分支選擇器的Java正則表達式

例如,在一個PCRE 3「分支」等

(\S+|d+|\s+) 

理想的答案將是具有共同的變量(比如,selector),其將被設置爲不同的值(比方說,「非-space」, 「數字」 和 「空間」),從而使switch聲明像

case "non-space": 
case "digit": 
case "space": 

可以事後執行。

該用例涉及一個正則表達式,它理解Java正則表達式,但不允許執行Java代碼,所以如果有答案,它必須是完全基於正則表達式的。

也許上述不能完成,所以任何建議的解決方法也是受歡迎的。 :-)

回答

0

Java中沒有可用的正則表達式選擇器。

但是,你的車使用Matcher和組。

Pattern pattern = Pattern.compile("(\\S+)|(\\d+)|(\\s+)"); 
Matcher m = pattern.matcher(input); 
if (m.find()) { 
    if (m.group(1) != null) { // non-space 

    } 
    if (m.group(2) != null) { // digit 

    } 
    if (m.group(3) != null) { // space 

    } 
} 
+0

我可以,但正則表達式引擎不允許Java代碼。所以,它必須是一個內置於正則表達式機制的機制,就像命名捕獲一樣。 – PNS

+0

好的,我明白了。如果我找到什麼,我會回來。 – gustf

+0

順便說一下,正則表達式引擎的輸入和輸出參數是什麼? – gustf

0

在Java中,你可以得到的最接近的是交替(爲您展示),以
執行不同的代碼路徑。正則表達式邏輯與if/then/else邏輯有點不同。

(?: 
     (?:    # ---------- 
      (?<a>)   # (1) 
           # do a code 
     | (?<b>)   # (2) 
           # do b code 
     | (?<c>)   # (3) 
           # do c code 
    )     # --------- 

     # Common code 
)+ 

PCRE有額外的邏輯稱爲條件。它最像是一個switch語句。

(?:    # ---------- 
     (?: 
      (?<a>)   # (1) 
     | (?<b>)   # (2) 
     | (?<c>)   # (3) 
    )     # --------- 

     (?(<a>)   # did a match 
           # do a code 
     |     # else 
      (?(<b>)   # did b match 
            # do b code 
      |     # else 
            # do c code 
      ) 
    ) 

     # Common code 
)+ 

但是,正如你所看到的,真的是有在這
背景下,兩者之間沒有什麼區別。

初級和實際上只使用正則表達式條件表達式(IMO)
是作爲一個標誌失敗或在代碼的某一點接受的匹配。
這使引擎有機會重試不同的組合。 (?(<a>)|(?!))

請記住,使用斷言將很長的路要走注入邏輯
到代碼。這在Java引擎中可用。

PCRE也具有函數調用結構,如果需要進行平衡文本匹配,則可遞歸地調用
。但是,這不是在Java中可用的

+0

你的回答似乎不完整,但無論你在哪裏,你似乎都在暗示這個方法不能用,因爲它會產生不同的變量名(「a」,「b」,「c」)。問題在於如何使用相同的變量名(比如說「選擇器「),每個分支產生不同的值(例如,選擇器=」a「或選擇器=」b「或選擇器=」c「) – PNS

+0

@PNS - 無需重複你在問題的帖子中陳述的內容。你正在摸索正則表達式中的C語言邏輯,也就是'switch'語句,它顯然不存在,你也不會在min,max loo中找到任何PS。你會發現有許多方法可以在正則表達式中執行邏輯,而這些方法在公共語言結構中不存在。我以爲你已經知道了。正則表達式相當豐富,可以做一些無法用通用語言簡單構造完成的事情。如果你的意圖是以某種方式將正則表達式與這種錯位的比較敲開,它將不會與專家一起工作。 – sln

+0

我問了一個非常明確的問題,知道(並指出)可能沒有答案。這沒有什麼不妥,因爲不需要消極性,陰謀論(「敲正則表達式」?)或講授。你是通過解釋命名組來回答的,這不是問題的關鍵,而你的回答是不完整的,因爲它以半個短語結尾(「例如」)。就這樣。謝謝你的時間。 – PNS