* U K I Y A H O N P O * Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura, che la diritta via era smarrita. |
間違いだらけの正規表現講座 おまけ 1
さくらスクリプトの正規表現さくらスクリプトをなるべく正確に正規表現にするのにチャレンジしてみます。 参考元は http://crow.aqrs.jp/reference/all/ です。 まずはチャレンジとりあえず書いてみたもの。 \\(\\|q\[.*?\]\[.*?\]|[!&8cfijmpqsn]\[.*?\]|[-*+014567bcehntuvxz]|_[ablmsuvw]\[.*?\]|__(t|[qw]\[.*?\])|_[!?+nqsV]|[sipw][0-9]) 分解すると \\ #\ 記号そのもの ( \\| #\\(エスケープされた\) q\[.*?\]\[.*?\]| #\q[id][選択肢表示名] [!&8cfijmpqsn]\[.*?\]| #\○[~]系 [-*+014567bcehntuvxz]| #\○系 _[ablmsuvw]\[.*?\]| #\_○[~] 系 __(t|[qw]\[.*?\])| #\__○ 系 _[!?+nqsV]| #\_○系 [sipw][0-9] #\w9と\i9 系 ) これだと、本当は \\ はさくらスクリプトのタグではない (表示文字として残さなければならない)ので反則なんですけど。 前読みを使ったパターン\\を残すとして、前読みを使うと冒頭がこうなります。 ((?<=\\\\)|(?<!\\))\\(q\[.*?\]~ ( (?<=\\\\)| #肯定前読み、\\\w9 のようなパターンに対応 (?<!\\) #否定前読み、\\w9 のようなパターンに対応 ) \\ (q\[.*?\]~ ただしこれだと、「\\\\w9」みたいなパターンには対応できないわけです。 さらにもう1個、冒頭の否定肯定を繰り返せば、「\\\\w9」には対応できますが、 それを延々と繰り返すわけにも行かない。 前読みで「偶数個マッチ」「奇数個マッチ」等ができる処理系はあまりないので、 どこかで妥協するしかないのでしょうね。 現実的な解としては、
という手順を踏むことによって解決できるのですが。 引っ掛けられなかったり、あるいは誤爆してしまう場合があったら教えてください。 ご指摘などはこちらへ |