いくつかのPHPテキスタイル実装(オープンソース、適切に属性付けされている)からかなり複雑な正規表現を借りて、完全なJava実装であるtextile4jをgithubに移植し、Mavenセントラルに同期しています(元のコードはJavaブログプラットフォームであるblojsomのプラグインを提供するために作成されました。これは、blojsomの依存関係をMaven Centralで利用できるようにするためのより大きな取り組みの一部です)。
残念ながら、テキスタイル正規表現は(preg_replace_callback
PHPのコンテキストで機能しますが)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|$|\)))
gskinnerによるRegExrやRegexPlanetなどのオンラインツールを使用して、解析エラーが発生する可能性のあるいくつかの領域を明らかにしました。ただし、これらの詳細のいずれもエラーを修正しません。
文字クラスの1つに範囲の問題が隠されているか、Unicodeの順序がどこかに隠れているのではないかと思いますが、見つかりません。
何か案は?
また、PHPが同様のエラーをスローしない理由にも興味があります。たとえば、1つの「パッシブ部分式」がRegExrを使用して適切に処理されていないことがわかりましたが、Java例外が修正されず、PHPの動作が変更されませんでした。下。
#title
エスケープされたパレンを切り替えます。
(?:\(([^)]+?)\)(?="))? # $title
...^
(?:(\([^)]+?)\)(?="))? # $title
....^
ありがとう、ティム
編集: RegexPlanetによって決定されたテキスタイル正規表現のJava文字列解釈(エスケープ付き)を追加します...
"(^|(?<=[\\s>.\\(])|[{[])\"((?:(?:\\([^)]+\\))|(?:\\{[^}]+\\})|(?:\\[[^]]+\\])|(?:\\<(?!>)|(?<!<)\\>|\\<\\>|\\=|[()]+(?! )))*)([^\"]+?)(?:\\(([^)]+?)\\)(?=\"))?\":([\\w\"$\\-_.+!*'(),\";\\/?:@=&%#{}|\\^~\\[\\]`]+?)(\\/)?([^\\w\\/;]*?)([\\]}]|(?=\\s|$|\\)))"