我從一些PHP Textile實現(開源,正確歸因)中借用了一個相當複雜的正則表達式,用於構建一個簡單的,功能不完整的Java實現textile4j,並將其移植到github,同步到Maven中心(最初的代碼是爲blojsom提供的一個插件,這是一個Java博客平臺;這是在Maven Central中提供blojsom依賴關係的一部分)。靠近索引nnn的未封閉字符類
不幸的是,紡織正則表達式的表達式(而他們中的PHP preg_replace_callback
環境中工作)失敗,在Java中,以下情況例外:
java.util.regex.PatternSyntaxException: Unclosed character class near index 217
的說法是明顯的,解決的辦法是難以捉摸的。
下面是PHP實現原料,多正則表達式:
return preg_replace_callback('/
(^|(?<=[\s>.\(])|[{[]) # $pre
" # start
(' . $this->c . ') # $atts
([^"]+?) # $text
(?:\(([^)]+?)\)(?="))? # $title
":
('.$this->urlch.'+?) # $url
(\/)? # $slash
([^\w\/;]*?) # $post
([\]}]|(?=\s|$|\)))
/x',callback,input);
巧妙,我得到了紡織類「告訴我的代碼」,在這個表達式中使用一個簡單的echo
,導致以下而長,正則表達式:
(^|(?<=[\s>.\(])|[{[])"((?:(?:\([^)]+\))|(?:\{[^}]+\})|(?:\[[^]]+\])|(?:\<(?!>)|(?<!<)\>|\<\>|\=|[()]+(?!)))*)([^"]+?)(?:\(([^)]+?)\)(?="))?":([\w"$\-_.+!*'(),";\/?:@=&%#{}|\^~\[\]`]+?)(\/)?([^\w\/;]*?)([\]}]|(?=\s|$|\)))
我已經發現了幾個可能被導致解析錯誤,使用在線工具,如RegExr by gskinner和RegexPlanet可能的領域。但是,這些細節都沒有解決錯誤。
我懷疑有一個範圍問題隱藏在其中一個字符類,或一個Unicode順序隱藏在某處,但我找不到它。
任何想法?我也很好奇爲什麼PHP不會拋出類似的錯誤,例如,我發現一個「被動子表達式」使用RegExr處理得不好,但它沒有修復Java異常,也沒有改變行爲在PHP中,如下所示。
在#title
切換逃脫括號:
(?:\(([^)]+?)\)(?="))? # $title
...^
(?:(\([^)]+?)\)(?="))? # $title
....^
感謝, 添
編輯:添加以Java String的解釋(與轉義)紡織正則表達式,如RegexPlanet確定...
"(^|(?<=[\\s>.\\(])|[{[])\"((?:(?:\\([^)]+\\))|(?:\\{[^}]+\\})|(?:\\[[^]]+\\])|(?:\\<(?!>)|(?<!<)\\>|\\<\\>|\\=|[()]+(?!)))*)([^\"]+?)(?:\\(([^)]+?)\\)(?=\"))?\":([\\w\"$\\-_.+!*'(),\";\\/?:@=&%#{}|\\^~\\[\\]`]+?)(\\/)?([^\\w\\/;]*?)([\\]}]|(?=\\s|$|\\)))"
''title'行對我來說看起來不錯。它可以選擇 –