2012-06-03 217 views
2

我想這正則表達式轉換成Java:翻譯有條件的正則表達式轉換成Java

^(\s*([<>]=?)?\s*!?(?:(2)[0-9]{1,5}|[0-9\*]{1,5})\s*(&|$))* 

我知道,條件語句不支持,當然。直接翻譯 導致異常。因此,我想知道如何解決這個問題。

感謝,

+4

這個正則表達式有什麼作用? –

+0

你的條件似乎有一個額外的冒號它不應該有,所以我看不出它可能曾經工作過的第一個地方。正確的模式應該是'^(\ s *([<>] =?)?\ s *!?(?(2)[0-9] {1,5} | [0-9 *] { 5})\ s *(&| $))*',儘管我對後面的位有些懷疑。順便說一句,你真的真的應該只有永遠,並且總是用'(?x)'aka'/ x'模式寫這些怪物。 – tchrist

+0

@IraBaxter你不理解正則表達式中的條件?真?檢查您的系統的* perlre *聯機幫助頁。 – tchrist

回答

2

首先,我認爲你有一個錯誤在你的模式:

^(\s*([<>]=?)?\s*!?(?:(2)[0-9]{1,5}|[0-9\*]{1,5})\s*(&|$))* 

你似乎在你的2組測試的前一個冒號,不會做什麼你要。這將需要是:

^(\s*([<>]=?)?\s*!?(?(2)[0-9]{1,5}|[0-9\*]{1,5})\s*(&|$))* 

但也有其他古怪,對我沒有多大意義。我將在(?x)模式中重寫您的模式,以便我們可以解開它並嘗試弄懂它。哦,我會在條件的or分支中刪除[0-9\*]中多餘的反斜槓,因爲它應該只是[0-9*]

產生這樣的:

(?x)      # enable comments and whitespace 
^       # anchor to beginning of string 
(       # begin GROUP #1 { 
    \s *     #  any amount of whitespace, including none 
    (      #  begin GROUP #2 { 
     [<>]    #  exactly one of either kind of pointy bracket 
     = ?    #  optional equals sign 
    ) ?     #  } end GROUP #2, make optional 
    \s *     #  any amount of whitespace, including none 
    ! ?     #  optional exclamation point 
    (?(2)     #  if GROUP#2 is defined { 
      [0-9] {1,5} #   then: 1-5× ASCII digits 
    | [0-9*] {1,5} #   else: 1-5× of either star or ASCII digit 
    )      #  } end ifdef GROUP#2 
    \s *     #  any amount of whitespace, including none 
    (      #  begin GROUP#3 { 
     &     #  either: an ampersand 
     | $     #  or else: end of string 
    )      #  } end GROUP#3 
) *      # } end GROUP #1, make optional but allow repeats 

儘可能靠近我可以告訴大家,那是你實際上是試圖做。爲什麼你這樣做,我不知道,因爲那裏有些東西看起來很奇怪。

例如,爲什麼將重複運算符應用於第一個捕獲組?它不會持有全部的重複,只有最後一個。

另一個問題是爲什麼允許第一組的零重複?就像* 所有可能的字符串匹配的模式^a*,所有可能的字符串都與您的模式相匹配。這似乎不太有用。

最後,具有或者一個符號的結束字符串是朝向端部有很奇怪。

如果原來的海報將澄清他的意圖,我會翻譯成的東西,與Java的正則表達式,不支持你在這裏所使用的條件結構工程,這個東西是Perl,PHP,PCRE和C 全部支持但不支持Java。 (無論如何,這會產生什麼語言?)你必須這樣做的方式是用兩個或兩個分支來展開條件,其中兩種情況都被覆蓋。

我對整個模式有點懷疑,因爲它看起來不合情理。一些示例輸入它應該匹配將不勝感激。

我不能強調的一件事是,我所提供的正則表達式的/x擴展版本是您永遠不應該寫這些東西的唯一方式。沒有空白,縮進,邏輯組和評論的那個混亂是完全不可接受的。像這樣的事情不應該通過代碼審查。他們是可憎的。

而且他們不一定是。我懇求你總是總是使用/x模式來處理任何非平凡的長度和複雜度的正則表達式,就像這個一樣。試着想想那些會在你之後來的人,希望在他們這樣做之前。

最後,我想知道爲什麼這會使用編號組而不是更多的助記符命名組,它們更健壯。再加上Java 7最終支持命名組,所以你不必在那裏妥協。