簡體   English   中英

索引nnn附近的未閉合字符類

[英]Unclosed character class near index nnn

我正在從一些PHP Textile實現(開源,正確歸因)中借用一個相當復雜的正則表達式,用於一個簡單的,不完全特征完整的Java實現,textile4j,我正在移植到github並同步到Maven central(原始代碼是編寫為blojsom提供插件,這是一個Java博客平台;這是在Maven Central中提供blojsom依賴項的更大努力的一部分。

不幸的是,紡織品正則表達式(雖然它們在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|$|\)))

我發現了一些可能導致解析錯誤的可能區域,使用gskinnerRegexPlanetRegExr等在線工具。 但是,這些細節都沒有解決錯誤。

我懷疑其中一個字符類中隱藏了一個范圍問題,或隱藏在某個地方的Unicode命令,但我找不到它。

有任何想法嗎?

我也很好奇為什么PHP不會拋出類似的錯誤,例如,我發現一個“被動子表達式”使用RegExr處理不當,但它沒有修復Java異常並且沒有改變PHP中的行為,顯示下面。

#title切換轉義的paren:

        (?:\(([^)]+?)\)(?="))? # $title
        ...^
        (?:(\([^)]+?)\)(?="))? # $title
        ....^

蒂姆,謝謝

編輯:添加Tex正則表達式的Java字符串解釋(帶轉義),由RegexPlanet確定...

"(^|(?<=[\\s>.\\(])|[{[])\"((?:(?:\\([^)]+\\))|(?:\\{[^}]+\\})|(?:\\[[^]]+\\])|(?:\\<(?!>)|(?<!<)\\>|\\<\\>|\\=|[()]+(?! )))*)([^\"]+?)(?:\\(([^)]+?)\\)(?=\"))?\":([\\w\"$\\-_.+!*'(),\";\\/?:@=&%#{}|\\^~\\[\\]`]+?)(\\/)?([^\\w\\/;]*?)([\\]}]|(?=\\s|$|\\)))"

@CodeJockey是正確的:你的一個角色類中有一個方括號需要轉義。 []][^]]是可以的,因為]是除否定^之外的第一個字符,但在Java中,未轉義[字符類中的任何位置都是語法錯誤。

具有諷刺意味的是,原始的正則表達式包含許多反斜杠,即使在PHP中也是如此。 它也逃脫/因為它用作正則表達式分隔符。 除草了所有這些后,我想出了這個Java正則表達式:

"(^|(?<=[\\s>.(])|[{\\[])\"((?:(?:\\([^)]+\\))|(?:\\{[^}]+\\})|(?:\\[[^]]+\\])|(?:<(?!>)|(?<!<)>|<>|=|[()]+(?! )))*)([^\"]+?)(?:\\(([^)]+?)\\)(?=\"))?\":([\\w\"$_.+!*'(),\";/?:@=&%#{}|^~\\[\\]`-]+?)(/)?([^\\w/;]*?)([]}]|(?=\\s|$|\\)))"

它是否是最好的正則表達式我不知道,不知道它是如何被使用的。

我不確定你的問題究竟在哪里,但這可能會有所幫助:

在Java中(我相信這是Java獨有的), [符號(不僅僅是]符號)在字符類中保留,需要進行轉義。

修訂后的表達式應該類似於以下內容,以便與Java兼容:

(^|(?<=[\s>.\(])|[{\[]) # $pre
"                       # start
(' . $this->c . ')      # $atts
([^"]+?)                # $text
(?:\(([^)]+?)\)(?="))?  # $title
":
('.$this->urlch.'+?)    # $url
(\/)?                   # $slash
([^\w\/;]*?)            # $post
([\]}]|(?=\s|$|\)))
/x

基本上,大多數正則表達式的任何地方都允許使用像[az,;[\\]+-]這樣的字符類[az,;[\\]+-]它可以匹配“字母a - z或逗號,分號,開放或關閉方括號,加號或減號簽名“,需要實際上是[az,;\\[\\]+-] (轉義[帶有\\字符]

這種轉義要求是由Java 聯合,交集和減法字符類構造引起的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM