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で質問しましょう!
似たような質問が見つかりました
- 統計学 「Newton」7月号特集記事 6 2022/06/07 21:27
- 数学 正規数の定義で分からないことがあります。 正規数の定義について専門書において 「xがr進正規であると 1 2023/07/17 20:50
- Excel(エクセル) EXCEL マクロで 同じフォルダ内の複数ファイルの複数行全体を選択して1つのファイルに集約 4 2022/09/27 18:41
- 工学 制御工学の問題について 1 2022/10/22 17:44
- Excel(エクセル) Excel関数の質問です。 5 2022/04/23 12:53
- その他(プログラミング・Web制作) プログラミング pythonの問題について 2 2022/04/19 00:41
- 数学 コインを投げて特定のパターンが出現する確率 5 2022/07/31 09:06
- 統計学 連続型の確率変数について 6 2023/08/25 08:44
- FTTH・光回線 ソフトバンク光2年縛り IP電話番号 同番移行出来ない? 光回線変更は面倒で難しいですか? 1 2023/01/08 21:54
- 統計学 統計学の問題です よろしくお願いします 回帰直線 次のデータから集計表を作成し,以下の問いに答えよ。 2 2023/01/31 23:36
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メールアドレスの正規表現について
-
正規表現で一致しない(否定)場...
-
(秀丸)正規表現で、特定文字列...
-
さくらエディタでGrep検索する...
-
grepの正規表現での最短マッチ...
-
PS4コントローラーをPCでゲーム...
-
wordの何も書かれていない2ペー...
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
Chr(13)とChr(10)の違いは?
-
「彡」って文字はなんという文...
-
TeraPadで改行が
-
VBAでの Replace関数で、ワイル...
-
セル内の文字列が日本語か英語...
-
EBCDIC⇒SJIS変換の方法
-
C#で年月を比較する
-
MMDでavi出力が出来ない
-
4Kの外部モニターに出力すると...
-
MS SQLServer のSQLで文字列の...
-
パワーポイントで文字の上に線...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正規表現 秀丸エディタ 行頭か...
-
正規表現でAND検索はできる...
-
vbaの正規表現で、マッチした一...
-
メールアドレスの正規表現について
-
文章中全ての半角カッコ ( の...
-
正規表現です。括弧内にある複...
-
Perl 数値にスラッシュを入れる...
-
[正規表現] 数字範囲をヒット...
-
正規表現でシングルクォーテー...
-
[VBS] テキストファイルから任...
-
C言語にパターンマッチってない...
-
MFCで正規表現
-
Mで始まりuで終わる文字列
-
C言語のコメントを「正規表現」...
-
正規表現でカウントアップ(?)す...
-
第二水準漢字が含まれるか?
-
特定タグ以外を変換したい
-
正規表現で囲まれた部分の文字列
-
grepの正規表現での最短マッチ...
-
1行~複数行をまとめる正規表現
おすすめ情報