![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
No.3ベストアンサー
- 回答日時:
Perl 5.10から正規表現に(?PARNO)という再帰する構文が加わりました。
その説明文に、まさに括弧対応の正規表現の例文があります。
http://fleur.hio.jp/perldoc/mix/pod/perl5100delt …
これをそのまま流用すれば、以下のようなコードが書けます。
my @expressions = qw{
(X1+X2)+X3
((X1+X2)+X3
((X1+X2))+X3
)(X1+X2)+X3
};
for my $exp (@expressions) {
print "$exp -> ", has_balanced_brackets($exp) ? 'OK' : 'NG', "\n";
}
sub has_balanced_brackets {
my $exp = shift;
my $re = qr{
^[^()]* # start of line
( # start capture buffer 1
\( # match an opening round bracket
(?: # match one of:
(?> # don't backtrack over the inside of this group
[^()]+ # one or more non round brackets
) # end non backtracking group
| # ... or ...
(?1) # recurse to bracket 1 and try it again
)* # 0 or more times.
\) # match a closing round bracket
) # end capture buffer one
}x;
$exp =~ $re ? 1 : return;
}
あるいは、文字列の先頭から1文字ずつ括弧を探し、開き括弧と閉じ括弧の数が同じかをチェックする方法はどうでしょうか?
とりあえず、質問者さん提示の例ではうまく動作しているようです。
sub has_balanced_brackets {
my $exp = shift;
my $bracket_count = 0;
for my $pos ( 0 .. length($exp)-1 ) {
my $char = substr $exp, $pos, 1;
if ( $char eq '(' ) { $bracket_count++ }
elsif ( $char eq ')' ) { $bracket_count-- }
last if $bracket_count < 0;
}
$bracket_count == 0 ? 1 : return;
}
No.2
- 回答日時:
CPU負荷(処理時間)を気にするとかなり難しいテーマになます。
「\(」や "" で囲まれた括弧は括弧で無いなんていう規則を付けても、やはり難しいテーマになります。
そうで無ければ、例えば、最も内側の () の組を可能な限り繰り返し削除した結果に 「(」か「)」を含めば NG 無ければ OK とすれば良いです。
最も内側の () の組を 1個削除するのは s/\([^\(\)]*\)//s で良いでしょう。 これをヒントにやってみてください。
禁止事項である課題の丸投げの疑いがあるので、完成コードは書きません。 追加質問は、どこまでできていて何が分らないのかを詳しく書いてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルで提出とは?
-
画像が表示でnull; this.src
-
perlをバージョンアップしたら...
-
Strawberry Perl for Windows ...
-
INDIRECT 横に再度抽出したい
-
PerlでUTF-8のファイルの文字列...
-
TeraPadエディターの操作方法に...
-
P.Cのシングルチューナーとダブ...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
Perlのエラーについてご教授く...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
bashスクリプト
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
perlで2次元配列をサブルーチ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
perl 正規表現でエラー
-
perl tr での変数の使い方
-
perlでの括弧対応チェック
-
演算子と括弧
-
Perlでの改造方法
-
perlのif文で・・・・・
-
ある書籍で、見つけました、per...
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
ユーザー定義関数に#NAME?が返...
-
グラフのX,Y座標を取得したい
-
Excel VBA 『Call』で呼び出す...
-
VBAで別モジュールへの変数の受...
-
エクセルVBAでシートモジュール...
-
'Range'メソッドは失敗しました
-
VBでグローバル変数を宣言するには
-
モジュールの最大数はいくつな...
-
VBAで旧字体を異字体に一括で変...
-
「デバイスは PRN を初期化でき...
-
LCD ディスプレイを Raspberry ...
おすすめ情報