![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
あれ? よく問題読んだら「ちょうど 2個の b を含まない」だった. 「bb を含まないもの」だと勘違いしてました. ごめんなさい.
とはいえ難しくはなく,
・高々 1個の b を含む
・3個以上の b を含む
パターンをそれぞれ書いて or で繋げば OK.
「ちょうど 3個の b を含む」パターンは
a*ba*ba*ba*
と書けますから, 3個「以上」だと
a*ba*ba*b(a|b)*
となります. これに前者のパターンを | で結べば OK.
No.5
- 回答日時:
他の方も書いてますが、否定は純粋な正規表現だけでは不可能です。
通常は、プログラミング言語の持つ、if-then-elseの機能を使って実現することになります。この問題だと限定された条件なのでPerl拡張などを利用すれば可能な気がしますが、実際にはそこまで頑張らず言語のelseの機能を使うんじゃないかな。>範囲が lex と yacc なのですが この場合はどの言語なのでしょう?
lexの正規表現は、egrepの正規表現(伝統的には拡張正規表現と呼ばれますが、多くの言語の扱える正規表現はさらにこれの「拡張」です)に、「開始条件」というlex独自の文脈機能を追加した物なので、おそらく「開始条件」を使うのでしょう。私は詳しくないので、直接の回答は書けませんが。
No.4
- 回答日時:
こんにちは。
> ちょうど2個の b を含まない任意の {a,b} はどう書くのでしょうか?
頭の体操ですね。これは楽しい。
・長さ 0 から 4 まで書き出してみた
・a を 0, b を 1 に置き換えてみた
長さ4までのものを | で並べたらこうなりました。
ε|0|1|00|01|10|000|...|111|0000|...|1111
εを除くと1桁から4桁の2進数のうち2桁の 11 (10進数の3) を除いたものは受理する、という感じかな??
ε |
(0|1) |
(0|1)0 |
(0|1)(0|1)(0|1) |
(0|1)(0|1)(0|1)(0|1) |
(0|1)(0|1)(0|1)(0|1)(0|1) |
:
:
:
これに + (1回以上) もしくは * (0回以上) で3桁もしくは4桁以降を括ってやればいけそうな予感がします! どんな感じでしょうか??
■長さ0
ε
■長さ1
0
1
■長さ2
00
01
10
11 // 受理しない
■長さ3
000
001
010
011
100
101
110
111
■長さ4
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
No.3
- 回答日時:
すみません, 誤解されるとまずいのでちょっと変更:
まず, 与えられた文字列全体を「a だけからなる連」と「b だけからなる連」に分解します. すると, 「a だけの連」と「1個か 3個以上の b だけの連」が繰り返されているということに気付くはずです. つまり, 前者を X, 後者を Y とすると「X と Y が繰り返されている」ということを正規表現で書けばよい, ということになります. これは, 例えば Y?(XY)*X? と書くことができます.
「b が連続しない」というのも同じように考えることができます. 「a だけの連」と「b」が繰り返されているので (X = a+, Y = b として)
Y?(XY)*X? = b?(a+b)*(a+)?
なんですが, (a+)? は a* と等価なのでちょっと最適化したのが #2 です.
あ, 空文字列はいいのかなぁ? ダメなら若干の修正が必要です.
No.2
- 回答日時:
う~ん, 正規表現は「否定」を苦手にしてるんだよなぁ.... もちろん「ある正規表現を否定した正規表現」を作ることは理論上常に可能なんだけど.
とグチを言ってもしょうがないのでヒント:
「{a, b} 上の文字列で b が連続しない」という正規表現は「b と b の間には a が 1個以上存在する」ということで
b?(a+b)*a*
と書けます.
今の例も, 「『b が 1個か 3個以上ある』というブロックの間には a が 1個以上存在する」と解釈できますね.
とここまで書いておいてアレですが, yacc で作るなら「bb があったら yyerror」とかやった方が早いのかもしれない.
No.1
- 回答日時:
とりあえず 'bb' も含めてマッチするので取り込んでから、
'bb' だけ弾くのが楽だしわかりやすいです。
どうしても一つの正規表現で書きたいという話なら、
何の正規表現を使うのか(Perlの拡張を使ってもいいとかダメとか)と
なぜそうしたいのかを補足してください。
回答ありがとうございます。
そうしたい理由は大学の試験でその問題が出たからで、
答えは非公開なので正解はなんだろう、ととても気になるのですが
どうにもアイデアが浮かばないので質問させて頂いてます。
自分は苦し紛れに (a|b?|bbb+)* と書きましたがこれでは
bb になってしまいますよね
範囲が lex と yacc なのですが この場合はどの言語なのでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正規表現 秀丸エディタ 行頭か...
-
文章中全ての半角カッコ ( の...
-
正規表現でAND検索はできる...
-
正規表現でシングルクォーテー...
-
[VBS] テキストファイルから任...
-
C言語にパターンマッチってない...
-
VBSのRegExpの拡張機能を有効に...
-
正規表現です。括弧内にある複...
-
PS4コントローラーをPCでゲーム...
-
EBCDIC⇒SJIS変換の方法
-
Chr(13)とChr(10)の違いは?
-
4Kの外部モニターに出力すると...
-
EXCELで=より左の文字を一括で...
-
エクセルでアルファベットか数...
-
Googleスプレッドシートでワイ...
-
Excelで3E8を3.00E+8にしない方...
-
Excelで指数表現しないようにす...
-
履歴書の志望動機の所で、「ま...
-
1文字って1バイトだったっけ?
-
「彡」って文字はなんという文...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正規表現 秀丸エディタ 行頭か...
-
正規表現でAND検索はできる...
-
メールアドレスの正規表現について
-
vbaの正規表現で、マッチした一...
-
文章中全ての半角カッコ ( の...
-
C言語のコメントを「正規表現」...
-
C言語にパターンマッチってない...
-
正規表現です。括弧内にある複...
-
第二水準漢字が含まれるか?
-
MFCで正規表現
-
[VBS] テキストファイルから任...
-
正規表現でシングルクォーテー...
-
正規表現で、青空文庫形式の入...
-
python 正規表現
-
正規表現でカウントアップ(?)す...
-
Perl 数値にスラッシュを入れる...
-
正規表現で、00で始まる画像をg...
-
wikiの差分表示
-
セルの長文を、正規表現で連続...
-
正規表現で囲まれた部分の文字列
おすすめ情報