我想這正則表達式轉換成Java:翻譯有條件的正則表達式轉換成Java
^(\s*([<>]=?)?\s*!?(?:(2)[0-9]{1,5}|[0-9\*]{1,5})\s*(&|$))*
我知道,條件語句不支持,當然。直接翻譯 導致異常。因此,我想知道如何解決這個問題。
感謝,
我想這正則表達式轉換成Java:翻譯有條件的正則表達式轉換成Java
^(\s*([<>]=?)?\s*!?(?:(2)[0-9]{1,5}|[0-9\*]{1,5})\s*(&|$))*
我知道,條件語句不支持,當然。直接翻譯 導致異常。因此,我想知道如何解決這個問題。
感謝,
首先,我認爲你有一個錯誤在你的模式:
^(\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最終支持命名組,所以你不必在那裏妥協。
這個正則表達式有什麼作用? –
你的條件似乎有一個額外的冒號它不應該有,所以我看不出它可能曾經工作過的第一個地方。正確的模式應該是'^(\ s *([<>] =?)?\ s *!?(?(2)[0-9] {1,5} | [0-9 *] { 5})\ s *(&| $))*',儘管我對後面的位有些懷疑。順便說一句,你真的真的應該只有永遠,並且總是用'(?x)'aka'/ x'模式寫這些怪物。 – tchrist
@IraBaxter你不理解正則表達式中的條件?真?檢查您的系統的* perlre *聯機幫助頁。 – tchrist