C言語版の鬼車ライブラリを利用して、ある検索プログラムを作成したいのですが、
1点質問です。
以下のような例文があるおします。
(例)
--
最初の試験、二番目の試験、三番目の試験、最後の試験
--
onig_search()を使用して上記から”試験”のすべての検出箇所を調べたいのですが、
パターンに”試験”を指定してonig_search()をコールしても最初の1件目のみしか
検出しません。
特殊なオプションが必要なのでしょうか?
それとも、パターン(正規表現)の書き方が誤っているのでしょうか?
問題が解決せず非常に困っています。
どなたか、解決策をお持ちの方は知恵を貸してください。
No.4ベストアンサー
- 回答日時:
#1/3です。
少々訂正。> startを前回のヒット位置(onig_searchの戻り値)+strへずらしながら
startを前回のヒット位置(onig_searchの戻り値) + str 「+ strlen(pattern)」へずらしながら
です。でないと無限ループしてしまいますね。
D-Matsu さん
回答ありがとうございます。
> 改めて仕様を読み直してみたら、戻り値が最初のヒット位置というだけで、それとは別に引数の構造体regionにヒット数と開始・終了アドレスが入るんですね。
> 読み違えてました。失礼。
確認ありがとうございます。
> さて、それを踏まえて例示されたコードですが、間違いはなさそうに見えます。
> こちらでも以下の環境下で試してみたのですが、
>
> ・OpenSuSE 11.4 x64
> ・gcc 4.5.1
>
> 配布元の最小限使用例に対してonig_newのencをUTF8に変えてpatternとstrを質問と同じ状態にしてみただけのコードで再現しますね……。
> ASCIIに直して追試したらUTF-8と同じ結果が出たので、なんとなくですがUTF-8の処理が甘いような印象があります。
>
> 「とりあえず回避」というやり方ですが、startを前回のヒット位置(onig_searchの戻り値)+strへずらしながらヒットしなくなるまで一つずつ拾っていく手かと思います。
すいません。再現確認までして頂いて感謝します。
そうですよね。。。
私もこの方法しかないと考えていました。
入力情報(検索対象とパターン)はファイルから読み込む設定値なので、プログラムを変えずに対応できれば
と思っていたのですが。。。了解です。
当初、鬼車ライブラリの使用方法の誤りかと思っていのたですが、
そうでもなさそうですね。
深夜に対応ありがとうございました。
No.3
- 回答日時:
#1です。
改めて仕様を読み直してみたら、戻り値が最初のヒット位置というだけで、それとは別に引数の構造体regionにヒット数と開始・終了アドレスが入るんですね。
読み違えてました。失礼。
さて、それを踏まえて例示されたコードですが、間違いはなさそうに見えます。
こちらでも以下の環境下で試してみたのですが、
・OpenSuSE 11.4 x64
・gcc 4.5.1
配布元の最小限使用例に対してonig_newのencをUTF8に変えてpatternとstrを質問と同じ状態にしてみただけのコードで再現しますね……。
ASCIIに直して追試したらUTF-8と同じ結果が出たので、なんとなくですがUTF-8の処理が甘いような印象があります。
「とりあえず回避」というやり方ですが、startを前回のヒット位置(onig_searchの戻り値)+strへずらしながらヒットしなくなるまで一つずつ拾っていく手かと思います。
No.2
- 回答日時:
#1 で書かれているように onig_search が
「start⇒rangeの間で最初にマッチした部分」を返す
というなら, それは「あなたが思っていた動作」に対して適切なコードではないと思われますが....
region の情報を使ってループ?
No.1
- 回答日時:
まず「どう呼んでいるか」を提示してもらわないことにはどこが誤ってるのかも指摘しようがないんですが……
API仕様を読んだ感じでは「start⇒rangeの間で最初にマッチした部分」を返すようなので、「意図に合うような呼び出し方をしていない」線が濃厚じゃないかという気はするのですが。
この回答への補足
D-Matsuさん
回答ありがとうございます。
>まず「どう呼んでいるか」を~
ごもっともです。
コメント用に少し簡易的に編集していますが、
概ねこんな感じです。
※
--ココカラ--
unsigned char *start, *range, *end;// 正規表現用ポインタ
regex_t* reg = NULL; // 正規表現オブジェクト
OnigErrorInfoeInfo;
char *Target = "最初の試験、二番目の試験、三番目の試験、最後の試験";
char *pattern = "試験";
onig_new(®, (unsigned char*)pattern, (unsigned char*)pattern + strlen((char*)pattern),
ONIG_OPTION_MULTILINE | ONIG_OPTION_IGNORECASE,
ONIG_ENCODING_UTF8, ONIG_SYNTAX_DEFAULT, &eInfo);
end = (unsigned char*) (Target + strlen((char*)Target));
start = (unsigned char*) pTarget;
range = end;
region = onig_region_new();
onig_search(reg, Target, end, start, range, region, ONIG_OPTION_NONE);
--ココまで--
で、onig_search()の結果として、構造体regionに格納されるのですが、
該当数を示すregion->num_regs は1 になっており、初回該当の情報のみ格納されています。
確認した感じでは意図通りの呼び方に見えたのですが、
期待値と異なります。。。
どうでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 簿記検定・漢字検定・秘書検定 1週間後にネット試験で日商簿記3級を受験する商業高校生です。 1 2022/09/12 22:29
- その他(悩み相談・人生相談) 現在定時制高校に通う高1です。高校卒業後(19歳) 自衛隊候補生採用試験を受けようと考えています。 1 2022/11/07 00:26
- 国家公務員・地方公務員 様々な意見を聞きたいのでもう一度 現在定時制高校に通う高1です。高校卒業後(19歳) 自衛隊候補生採 2 2022/11/07 11:50
- 国家公務員・地方公務員 現在定時制高校に通う高1です。高校卒業後(19歳) 自衛隊候補生採用試験を受けようと考えています。 4 2022/11/07 08:05
- その他(職業・資格) 高卒認定試験の勉強法、難易度について 2 2023/04/04 00:01
- 日本語 「使われている」と使い方が違うのは次のどれか 1 2022/07/11 20:08
- その他(プログラミング・Web制作) VB.NETの正規表現について 4 2022/04/12 16:54
- その他(職業・資格) 資格試験の過去問 1 2023/07/13 16:34
- 国家公務員・地方公務員 公務員試験の数的処理で苦戦しています。 1 2023/01/30 08:56
- 統計学 統計学の質問【帰無仮説】 高校の新学習指導要領では、統計的仮説検定の基本的な考え方が必修単元となった 5 2023/05/23 21:00
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
30歳未満とは30歳は含まれない...
-
ACCESSで空白のデーターをクエ...
-
耐圧試験と気密試験
-
空試験
-
中3 期末テスト と 曾祖母...
-
本試験と空試験
-
【電気】交流電流試験とコロナ...
-
友人の結婚式と試験が重なって...
-
創価学会 任用試験
-
今度試験で腕立て伏せ30回しな...
-
尿検査でベネディクト法と尿試...
-
今回担当現場のキュービクルに...
-
テストピースとはどういったも...
-
高圧絶縁耐圧試験について。教...
-
井戸掘削工事の費用の処理について
-
食品衛生試験法 過酸化物価測...
-
船舶試験について
-
大事な資格試験前で遊びに誘う...
-
試験などで、リスクアセスメン...
-
土質について?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ACCESSで空白のデーターをクエ...
-
耐圧試験と気密試験
-
本試験と空試験
-
30歳未満とは30歳は含まれない...
-
空試験
-
自衛隊の部内幹部候補生になる...
-
個人タクシーになる為の試験の...
-
船舶試験について
-
CDNのセキュリティ対策の説明
-
なぜか過酸化物価が…
-
試験などで、リスクアセスメン...
-
会議/試験に「参加・出る・出席...
-
基板のイニシャル費の処理方法
-
高圧絶縁耐圧試験について。教...
-
テストピースとはどういったも...
-
衛生管理者の試験申込に利用す...
-
【電気】交流電流試験とコロナ...
-
尿検査でベネディクト法と尿試...
-
次の一月(2025年1月)にあるFP...
-
井戸掘削工事の費用の処理について
おすすめ情報