[javascript]正規表現を正規表現で表現できるかな

正規表現自体・・・

呪文

と呼ばれているので

下のテキストから正規表現の部分をパースしなさいとかは、難題

(* 文法   *)
        syntax      =   rule_list /\s*/ ;
        rule_list   =   { ( rule | special_effect | comment ) } + ;
        rule        =   identifier defining_symbol definitions ";" ;
        defining_symbol = "=" | "::=" ;                                     (* 終端記号 '=':EBNF, '::=':BNF *)
        (* 定義   *)
        definitions =   definition { "|" definition } ;                     (* 定義リスト *)
        definition  =   choice ;                                            (* 定義 *)
        (* リスト *)
        choice      =   sequence { "|" sequence } ;                         (* アレかコレかソレかのどれか *)
        sequence    =   exception { [ "," ] exception } ;          		    (* アレとコレとソレの一式。","は空白改行と同義  *)
        exception   =   words, { "-" words } ;          			        (* アレが良いが、コレとソレを除く。 *)
        (* 語彙   *)
        words       =   [ comments ] word [ comments ] ;
        special_effect =  (*$ NO SPACE SKIP $*) "(*$" /[^\\?]*/ "$*)" ;     (* 特殊効果 *)
        comments    =   ( special_effect | comment ) repeat_symbol;
        word        =   ( sq_string | wq_string | wraper | special_text | regexp | identifier ) ;
        comment     =   /(?:\(*))(?![*][/])(.*)(?:*\))/ ;                   (* 注意書き *)
        sq_string   =   /(?:')(?!\\\\)[^']*(?:')/ ;                         (* ' で括られたテキスト *)
        wq_string   =   /(?:")(?!\\\\)[^"]*(?:")/ ;                         (* " で括られたテキスト *)
        bq_string   =   /(?:\`)(?!\\\\)[^"]*(?:\`)/ ;                       (* " で括られたテキスト *)
        (* 囲み   *)
        wraper      =   ( group | option | repeate ) repeat_symbol ;
        group       =   "(" choice ")"  ;                                   (* choiceを明示的に括る表現 *)
        option      =   "[" choice "]"  ;                                   (* あれば尚良し *)
        repeate     =   "{" choice "}"  ;                                   (* 0回以上繰り返す *: 0回以上、+:1回以上 *)    (* TODO choiceを使うと exceptionで[undefined]が返る *)
        regexp      =   /.+/([a-z]*)  ;      
        identifier  =   /[A-Za-z][A-Z_a-z0-9\\x20]*[A-Z_a-z0-9]*/;          (* 識別子 *)
        special_text =  (*$ NO SPACE SKIP $*) "?" /[^\\?]*/ "?" ;           (* 特殊文字列 *)
        repeat_symbol=  [ "*" | "+" | '{' [ number ] ',' [ number ] '}'];   (* 繰返し記号 *)
        number      =   /\d+/ ;

なので

regexp  =  /.+/([a-z]*) ;

とか表記は誤魔化してたけど、

実際にはこれでパースするとテキストの終りの手前までヒットしてしまう。

とある記事で、エスケープ表現の文字を潜り抜けさせる方法が載ってた。

 (¥¥@)[^@]+   ※@は任意の文字

な感じで@のエスケープ表現の2文字@以外の文字を来るかえす表現をしていた。

これを真似て

/ ( ( \ / ( ( \ \ / ) | ( [ \ / ) | [^\ / ] ) * \ / ) ( [ a – z ] * ) ) /

※崩れた顔文字ではありません、読みにくいので空白を挿入しました。

を作って試してみた結果は

うまくいってるみたいだ。

しかし、長い。長すぎる。




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA