- ベストアンサー
Cで正規表現を使ってPerlの一部を実現する方法
- Cで正規表現を使ってPerlのような一部の処理を実現する方法について教えてください。
- Perlでの正規表現パターン/^(.).*/gと同等の処理をCで行う方法を教えてください。
- 具体的な例として、文字列$searchwordsに対して$ searchwords =~ /^(.).*/gが成立している間は、文字列の先頭の一文字を取り出す操作をどう実現すればよいか教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
そういうことですか。それならばループしますね。1文字づつ $1 に入ります。(元の文字列が 'ab' だったら1回目に 'a' が $1 に入り、2回目に 'b' が $1 に入ります)。 ただ、そうならばこう書いても $1 に入る文字は一緒です。 while($searchwords =~ /(.)/g) { # ここで print "$1\n"; などとすると # 1文字づつ取り出される様子が分かる。 } Cでやるとするとこんな感じになります。 char a[] = "abcdefg"; /* 元の文字列 */ char c; /* 取り出した1文字を入れる変数 */ int i; /* 取り出す位置を決める変数 */ for (i = 0; a[i]; i++) { c = a[i]; /* ここで putchar(c); などとすると1文字出力される。 */ } for の終了条件が a[i] だけでもちゃんと動く理由は、Cはこのような宣言でダブルクォーテーションで括った文字列で初期化すると文字列の終りに必ず '\0' が入るためです。
その他の回答 (1)
- noboru2000
- ベストアンサー率33% (47/140)
まずその正規表現ですが、一番最初に ^ 記号があるため、g オプションの意味が全くなくなっています(もし ^ がなかったとしても最後に .* があるためこの場合やはり意味がありません)。で、結局 $1 に $searchwords 先頭の1文字が入って一回でループを抜けます。つまり while で書く必要性がありません。単に $searchwords =~ /^(.)/; と書いた時と全く同じ結果になります。 Cで書くとしたら、たとえば char a[] = "abcdefg"; と初期化されていたならば a[1] = '\0'; とやって a を結果とするか、または別に char b[2]; などと配列を作っておいて b[0] = a[0]; b[1] = '\0'; とやって b を結果とすればできます。(どちらかというと後者の方がPerlのやっていることに近いです。Perl のパターンマッチは元の文字列を壊しませんから)。
補足
実際に動いているプログラムを使ったことがあります。 おそらく一回で抜けることはないと思いますが。。。 もしかしたらwhileのループ内でサーチワードをずらしているのかも知れません。 >whileで書く必要はありません。 実際わたしがwin32コンソールに移植しようとしているperlソースはwhileを使ってあります。 cygwinで使用したこともあり、1回でループは抜けないと思います。。 while($searchwords =~ /^(.).*/g) { $searchwords =~ s/^(.)//; } ソースから抜粋しましたが。。実際のソースはこうなっているから動作するのでしょうか?
お礼
それとわからないのがもうひとつあります。 my ($a, $b, @c, $d, %e, $f_g); とか push(@ulist, search_google($search_host, $1, 0, 100)); if($#ulist != $arrsize) { $arrsize = $#ulist; push(@ulist, search_google($search_host, $1, 100, 100)); } とかです。 いろいろなサイトから抜粋しているのでごちゃごちゃですいません。 これらの意味も説明していただけないでしょうか?できればCでの書き方もよろしくお願いします。そのほうがわかりやすかったりもします。
補足
for (i = 0; a[i]; i++) { c = a[i]; /* ここで putchar(c); などとすると1文字出力される。 */ } これがa[7]のときループは終わるのでしょうか? あと while($searchwords =~ /^(.).*/g) { $searchwords =~ s/^(.)//; //何らかの処理 } は for (i = 0; a[i]; i++) { c = a[i]; /* ここで putchar(c); などとすると1文字出力される。 */ }と同じということは a[i]が成立していることが条件なので a[i]が\0などを参照するとループを出るということなのでしょうか?