• ベストアンサー

演算子と括弧

perlで以下の事をやりたいのですが、いい方法が浮かびません。 文字列に含まれる括弧のそばに演算子が 無い場合はエラー(NG)にしたいのですが、 いい方法は無いでしょうか "あ(" が含まれる場合はNG "a(" が含まれる場合はNG "*(" が含まれる場合はOK "+(" が含まれる場合はOK "((" が含まれる場合はOK ")(" が含まれる場合はNG "("だけ が含まれる場合はOK 環境: SunOS 5.8 perl5 eucのみです

質問者が選んだベストアンサー

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

#2 の 3条件をまともに満たすと, 厳密には「正規表現」では処理できません (正規表現では, 括弧の対応をとることができないので). ですが, Perl の「正規表現」だと処理できちゃったりします. 「プログラミング Perl」第3版 Volume 1 にはこの辺も書いてあるので, それを見れば書けるはずですが, (??{ $x }) を駆使する必要があって面倒なので気が向いたら書きます. もしくは, 「構文解析」をさせる方がよいかもしれません.

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

#3 です. ああ, ステップバイステップで書けば簡単だった. まず, 目標とする正規表現を $expr に入れることにしましょう. すると, 目標としては ・1文字なら OK → \w ・式を + とか * でつなぐのは OK → (??{ $expr }) (?:[+*] (??{ $expr }))* ・括弧でくくっても OK → \( (??{ $expr }) \) なので, 全体で my $expr; $expr = qr/ \w | (??{ $expr }) (?:[+*] (??{ $expr }))* | \( (??{ $expr }) \) /x; かな? もっと簡単になるかもしれませんが.

ritomo
質問者

お礼

ご回答ありがとうございます。 明日にでも試してみます。 ありがとうございました。 取り急ぎお返事しました。

回答No.2

再び、補足要求です。 目的は、文字列が以下3つの条件を満たすような「式」として妥当かどうか、を判別したいように見受けられるのですが、 いかがでしょうか。 [3つの条件] ・a : 1文字からなるものは式である ・expr + expr : 式と式を + もしくは * で結合したものは式である expr * expr ・(expr) : 式を ( ) で囲んだものは式である というのは、文字列に含まれる括弧のそばに演算子の有無だけをチェックしますと、 A+B)*C のような相対する括弧がない文字列も OK ということになってしまうのですが。

ritomo
質問者

お礼

[3つの条件]の件、合っています。 よろしくお願いします。

回答No.1

正規表現でマッチングするのがいい方法だと思います。 なお、提示された情報は、プログラムを組み立てるのに十分でなく、 次のことをはっきりさせる必要があります。 ・「演算子」とは、具体的にどういった文字をさすのか。 ・対象となる「文字列」に「括弧」は必ず含まれるのか? ・その場合、「括弧」は一つだけなのか、それとも複数含まれるのか? ・「括弧」が複数あった場合、ひとつの括弧でも演算子がそばになければNGなのか? ・「括弧」の"そば"というのは、前だけなのか、後ろもありなのか。

ritomo
質問者

お礼

お返事ありがとうございます。 ・「演算子」とは、具体的にどういった文字をさすのか。 →()*+の4種類です。 ・対象となる「文字列」に「括弧」は必ず含まれるのか? →含まれるとは限りません。  A+B (A+B)*C ・その場合、「括弧」は一つだけなのか、それとも複数含まれるのか? →複数有りです。  ((A+B)*(C*D)+E) ・「括弧」が複数あった場合、ひとつの括弧でも演算子がそばになければNGなのか? →(((A+B)*(C*D))) OK  (A+B)(C*D) NG ・「括弧」の"そば"というのは、前だけなのか、後ろもありなのか。 →前も後ろもありです ただし文字列の前と後ろは無しです。 以上のような条件です。

関連するQ&A