Ognacの雑感

木漏れ日々

目次

Blog 利用状況

書庫

ギャラリ

関数の引数を正規表現で分解する

rc = FUNCA ( a , b ) ; の引数は a と bです。 rc = FUNCB ( FUNCA(a,b) , c) の引数は FUNCA(a,b) と c の二つです。 同様に FUNC_x( xx, x,,,(((....))),,,,) と幾らでも入れ子にできます。 この文字列を 、アプリケーションで処理する時、少し面倒です。 "(" に対応する")"を見つけるのは、順次読み飛ばして行くのが確実でしょう。 字句解析を作りこむのは大層で、少し面倒です。 正規表現でなんとか処理できないでしょうか。字面処理なので、できないように思われがちです。 しかし、ネストカウント処理が可能です。 .net.Framework方言では
(?'TITLE'[^\(\)]*)(((?'O'\()[^\(\)]*)+((?'C-O'\))[^\(\)]*?)+)*(?(O)(?!))
です。Unix系では別の書式のようです。(不案内ですがwww)

今回は 、次の文字列を分解してみました。
 Func_A ( FuncB( a , b ) ,     Func_C( a , b , c) , Func_D( Sin(30) , cos(40) ) , 漢字 )

http://www.ognogn.com/Regex/Analize_Argument.aspx

結果は
 関数 :Func_A
       引数 : FuncB( a , b ) ,     Func_C( a , b , c) , Func_D( Sin(30) , cos(40) ) , 漢字
 関数 :FuncB
       引数 : a , b
 関数 :     Func_C
       引数 : a , b , c
 関数 : Func_D
       引数 : Sin(30) , cos(40)
 関数 :Sin
       引数 : 30
 関数 : cos
       引数 : 40

 となり、目的は達します。構文解器を作らなくても、ここまでできます。
開き括弧に対応する閉じ括弧で開始括弧を置換するので「(?'C-O'~」は「Oから此処までの文字列をCに入れる」(コメント参照)、再帰に不慣れだと戸惑いますが、便利なものです。

下手に説明するよりソースを見るほうが、一目瞭然でしょうから、小汚いソースを載せておきます。

 

投稿日時 : 2008年9月5日 0:45

Feedback

# re: 関数の引数を正規表現で分解する 2008/09/05 4:56 れい

> 開き括弧に対応する閉じ括弧で開始括弧を置換するので、再帰に不慣れだと戸惑いますが、便利なものです。

この辺、おかしいですね。
「(?'C-O'~」は「Oから此処までの文字列をCに入れる」であって、置換じゃないです。

一致の動作も「ネスト」じゃなくて「カウント」です。
なので「(?(O)(?!))」ここでカウンタが0であることを確認する必要があるわけで。

「対応する文字」「3つ組になっている文字」など、「カウント」で対応できるものは正規表現でなんとかできますが、「ネスト」は仕組み上対応できません。

OgnacさんのサンプルもネストしてるのはC#であって正規表現エンジンじゃないです。

ところで。

グループ名称を書くのに私は「<groupname>」を使うことが多いです。
Ognacさんは「'groupname'」ですか?

# re: 関数の引数を正規表現で分解する 2008/09/05 8:15 Ognac

>OgnacさんのサンプルもネストしてるのはC#であって正規表現エンジンじゃないです。
ご指摘ありがとうございます。一部混乱してました。
詰めが甘いですなぁ。反省!

>Ognacさんは「'groupname'」ですか
&gt,&ltを考慮するときは 'xxx' です。通常は<xxx> ですね。

# VsormFUmwncqGskSiA 2021/07/03 2:21 https://amzn.to/365xyVY

Im grateful for the blog.Much thanks again. Much obliged.

# dSaIbjFZQYo 2021/07/03 3:51 https://www.blogger.com/profile/060647091882378654

that i suggest him/her to visit this blog, Keep up the

# re: ??????????????? 2021/08/09 14:06 hydroxychloroquine

what is chloroquine https://chloroquineorigin.com/# hydroxychloroquine 200 mg

タイトル
名前
Url
コメント