すいません。もう一度質問します。
C言語で「正規表現」プログラムしたいです。
「[0-9]」や「[a-z]」の検知をどのようにプログラムしたらいいかアドバイスください。
問題は『「.」は任意の文字一文字が存在することを示し、「*」はその前の文字の任意の繰り返し(1回もあり)「[文字-文字]」はその中のいずれかの文字の存在を示す。 これらを用いて「b.c」(argvを用いてキーボード入力)ならb1c、bsc、bah等を、「6*」なら6、66、6666等の存在する行(ファイルをよみこんで)を出力するプログラムをCで書け。』ということです。
なかなか分かりません。
むずかしいです。
No.3ベストアンサー
- 回答日時:
まずまともに正規表現によるパターンマッチングを行うのは難しい話ですが、そのサブセット(一部機能)でかつ速度をきにしなければ、オートマンまで持ち出さなくてもプログラムできます。
問題の中には[0-9], [a-z] などの表現に対応せよと書いてありますか?
'.' と '*'(これ'+'の間違いではないですか?1文字以上だと'+'で、'*'は0文字以上ですけど、普通は)が課題ですね。
上記だけだと、 与えられた正規表現文字列s[]と検索対象の文字列src[]とを比較していくだけです。
[X-Y](X, Y は序列のある文字)の表現を組み込みたい場合は、一度内部形式に変換したほうがよいでしょう。
たとえば、
struct regt {
int type; /* type = 0 .. 1文字, type = 1 .. 任意文字, type = 2 .. 範囲文字 */
int n; /* n = 0 .. 0 1文字のみ, n = 1 一文字以上, n = 2 ... */
char a; /* 1文字の時にはここに入れる */
char b; /* 範囲文字の時にはここにも入れる */
} rege;
のようにして、配列 rege[] に一度正規表現を変換していれます。
そうすると後段の処理がやりやすくなります。
つまり、一つのクリアすべきマッチング単位に配列にするわけです。
一致すれば次の配列要素に進めますから。ポイントは * のコーディングですね。
まあ、ヨーク考えてください。
実用的であることを考えなければ(速度が遅くてもよければ)、src[0]からマッチするか、src[1]からマッチするか、src[2]からマッチするかとやればOKです。
<本当は>
正規表現では決まりとして、たとえば "b.*b" という表現だと "bxbxxxbxx" という文字があれば、はじめの"bxb"ではなくて、"bxbxxxb"にマッチする必要があります。
が、行を指摘するだけならばどちらでもかまわないでしょう。
No.2
- 回答日時:
正規表現を読んで決定性有限状態オートマトンを自動生成するプログラムを
書けということでしょうか。
maroniichanさんのスキルは分かりませんが、結構難しい話ですよね。
とりあえず、参考URLの図でも見ながら考えてみて下さい。
参考URL:http://buri.sfc.keio.ac.jp/~yosuke/keisan-kino-r …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# C#の問題です。 文字列型の配列 s[100] にキーボードから入力された100文字以内の文字列(単 2 2022/06/22 15:18
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- C言語・C++・C# C言語の質問です。 以下の命令を実行するプログラムを作りました ①文字列aとbの長さを表示 ②aとb 1 2022/04/29 15:35
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
sedの正規表現でグループ化する...
-
CSVファイルの中で、「 , 」カ...
-
英数字のみ全角から半角に変換
-
エクセルで数値を全角文字(カ...
-
マクロを使ってフォルダー内に...
-
IEからEdgeへの移行に伴うIMEの...
-
カンマ区切りの数字をCSVフ...
-
Excel VBAでPDFファイルをMicro...
-
EXCELからCSVにすると余計なカ...
-
エクセルにMicrosoft Barcode C...
-
各項目がダブルクォーテーショ...
-
ダブルコーテーションの置換
-
csvデータ ダブルクォーテ...
-
VBA 置換文字がみつからない時
-
正規表現で、特定の文字列を含...
-
CString から LPCTSTRの型に変換
-
スペースで区切られた氏名から...
-
プログラミングでは、半角括弧...
-
カンマ区切り
-
VBA 文字に半角が含まれて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
正規表現
-
正規表現でパスワードのチェック
-
正規表現で「円(価格)」文字列...
-
コマンドプロンプトでのsedの使...
-
sedの正規表現でグループ化する...
-
シェルスクリプト [[ $number =...
-
正規表現-数字
-
正規表現で数字をメタ文字に置...
-
正規表現 .+? について
-
この正規表現を教えて!
-
【正規表現】コメントアウトさ...
-
正規表現。行頭が○○以外にマッ...
-
Perlで別ファイルから文字列の抽出
-
正規表現について VB6
-
メールアドレスかどうかの
-
配列中の検索文字全が含まれる...
-
置換演算子についての疑問
-
配列内の要素をパターンマッチする
-
アスタリスクを検索できません
-
perlで記号除去を行いたいので...
おすすめ情報