• ベストアンサー

マッチングの件です

ただ今まだ実際に実行できる環境設定が出来ていないので、 実行すればすぐに解ってしまう事なのかも知れませんが質問させていただきます。 $str =~ s/\s*$//;でマッチしない場合は、対象文字列が文字や数字で 終わっていたらマッチしないということですか?

  • Perl
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> $str =~ s/\s*$//; このパターンなら、$strの中身がなんであれ、マッチに成功します。

その他の回答 (1)

  • aton
  • ベストアンサー率47% (160/334)
回答No.2

'*' は「0回以上の繰り返し」ですから,No.1の方が書かれているとおり,$strの中身がなんであれ全てマッチすると思います。

関連するQ&A

  • C言語、スキャン集合について

    下記のプログラムはスキャン集合を使って入力された文字列の先頭に 並んでいる数字を読み込んで捨て、その後に続く文字列を読み込んで 表示するものです。 #include <stdio.h> int main(void) { char str[80]; printf("数字に続けて文字列を入力してください\n"); scanf("%*[0-9]%s", str); printf("%s", str); return 0; } 【質問】%*[0-9] を %[^0-9] に置き換えてコンパイルして実行すると、 意味不明の文字列が出力されるのはなぜでしょうか? 置き換えても同じ結果になる気がするのですが…

  • マッチングの方法

    文字列のマッチングについての質問なのですが、 たとえばですが、 変数1:あいうえおかきくけこ 変数2:あいうえおかきんんこ とあった場合、どれだけマッチしているかを考える方法は 10文字中8文字一致なので80%マッチ とか 先頭から7文字は同じであとは違うから70%マッチ とかを考えています。 質問は、 これ以外の判定方法でよいものはあるでしょうか? 上記2つの場合、やはり1文字1文字比較していくしかないでしょうか? perl関数など一通り調べてみたのですが、見つかりませんでした。 おねがいします。

    • ベストアンサー
    • Perl
  • これで正しいのでしょうか?

    文字列の先頭にNULLを付けたい時文字列の次の文字が半角の数字だった場合"\01234"とすると先頭がNULLになりませんでした。 "\0001234"としたときちゃんとNULLになり、その場合"\000こんにちわ"でも先頭はNULLでした。"\0こんにちわ"もNULLでした。\000というのは正しい使い方なのでしょうか? #include <stdio.h> int main() { char str[] = "\0009\n"; printf("%s", str+1); return 0; } ついでに質問です。"こんにちわ\n"や"おはよう\n"などの文字列の先頭にNULLを付けて初めから文字列リテラルを作りたい場合にマクロで"\000こんにちわ\n"などと置き換えたい場合、できればM("こんにちわ\n")という形で作る事は可能でしょうか? M(こんにちわ\n)を"\000こんにちわ\n"に置き換えるマクロは作れました。 #define M(str) M1(\000##str) #define M1(str) #str こんな感じなのですがもっとうまい方法はありますか? よろしくお願いします。

  • 文字化けしない書き方

    CString str = "%#.3f" という文字列に関して、数字部分をint valで置き換えたいなと思っています。 そこで、Formatを使って以下のように書きましたが、%#.が文字化けしてしまいます。 str.Format("%s%df", "%#.", val); 1文字ずつなら表示されるようなのですが、%#あるいは#.とやると文字化け(□)になって しまいます。なので、 str.Format("%s%s%s%df", "%", "#", ".", val); とやると、表示されるには表示されるのですが、str.Format("%s%df", ...)という書き方で 書けたらなと思っています。何か方法はないでしょうか。 よろしくお願いいたします。 環境はWindowsXP, VC2005++ &MFC です。

  • 文字列の中間位置にマッチするアサーション表現

    文字列の中間位置にマッチするアサーション表現 qr{ ^ \w+ \s+ \d+ \s+ \d+ $ }xms の規則で $strに文字列が複数行格納されています。 スペースの個数に関しては任意です。 my $str = <<EOF ; BBB 0 00 AAA 1 01 AAA 2 10 : EOF 上記例で行頭がAAAで始まる、末尾の連続した数字の先頭にマッチする正規表現を教えて頂けないでしょか? AAA 1 01 の01の先頭に位置にマッチするアサーションを知りたい 後読みを用いたいのですが、空白の数が任意のためうまく書けずに困ってます。

    • ベストアンサー
    • Perl
  • 修正おねがいします。

    コンパイルして得られる実行ファイルを list1 として、 %list1 文字列1 文字列2 ・・・ を実行すると文字列1、文字列2、・・・を連結した一つの文字列を動的に生成した領域に格納し、それをディスプレイ上に表示するプログラムを作成しようと思います。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char *argv[]) { char s[50]; int n = 0; int count = 0; char *str; if(argc < 2) puts("連結できませんでした"); else{ for(n = 1; n < argc; n++) { str = argv[n]; for(;*str != '\0'; count++) { s[count] = *str; str++; } } } s[count] = '\0'; str = malloc(strlen(s) + 1); if(str != NULL){ strcpy(str, s); printf("%s\n", s); free(str); } } これでは実行できません。どこをどう修正すべきでしょうか? また、まったく違うのであれば正しいのを教えてください。 すいません。よろしくお願いします。

  • isdigit

    char s[3] = "5"; if(isdigit(atoi(s)) != 0){ printf("数字"); } としても表示されません。というよりifの中に入らないのですが どうしてでしょうか? それと文字列の最初の文字が数字かどうかの判定 をしたいのですが どうすればいいのか教えて下さい。 char *str; str= s; と配列の先頭にポインタを割り当ててみましたがどうもよくわかりません。

  • 明解C言語 入門編 P219 について

    以下のプログラムの理解について、質問です。 入力した文字列に、0 ~ 9 の数字がそれぞれ何度含まれていたかをカウントするプログラムです。 (明解C言語 入門編 P219) ========== プログラム ========== #include <stdio.h> void str_dcount(const char str[], int cnt[]) { unsigned i = 0; while(str[i]) { // str に '\0' が現れるまで繰り返し if(str[i] >= '0' && str[i] <= '9') cnt[str[i] - '0']++; // !!!! ココです !!!! i++; } } int main(void) { int i; int dcnt[10] = {0}; char str[100]; printf("文字列を入力してください : " ); scanf("%s", str); // 文字列を str へ str_dcount(str, dcnt); // 引数  str = 入力した文字列, dcnt = すべて '0' puts("数字文字の出現回数 "); for(i = 0; i < 10; i++) printf("'%d' : %d\n", i, dcnt[i]); return 0; } ========= 実行結果 ========= 文字列を入力してください : 3.14159 数字文字の出現回数 '0' : 0 '1' : 2 '2' : 0 '3' : 1 '4' : 1 '5' : 1 '6' : 0 '7' : 0 '8' : 0 '9' : 1 ========== 質問内容 ========== 関数 str_dcount 内の 『 cnt[str[i] - '0']++; 』 がどのような処理を行っているのか、理解ができません。 以下のように考えたのですが、それでは上手く動かないとの結論に至りました。 たとえば、i = 0 で、str[100] = 3.14159 であるとき、 /* ループ1回目 */ cnt[0] = str[0] - 0; /* 3 - 0 で cnt[0] には 3 が入る。 */ cnt[0++]; /* ループ2回目 */ cnt[1] = str[1] - 1; /* "." - 1 となる。 数字ではないので減算できずエラーになるのでは? */ cnt[1++]; /* ループ3回目 */ cnt[2] = str[2] - 2; /* 1 - 2 なので、なぜか負の数になってしまう。。 */ cnt[2++]; 配列の添え字が、配列になっている cnt[str[i]] までは理解できますが、 以下の2点が解っていないために理解ができていないようです。 1) cnt[str[i] - '0']++ ; の - '0' が何を行っているのか 配列には数字が入っており、そこから文字 '0' を減算しているのでしょうか? 数字から文字を減算できるのでしょうか? 2)  ++  はどの値を増加させているのでしょうか? 宜しくお願いします。

  • 正規表現で「円(価格)」文字列をマッチさせるには?

    お世話になります。 テキストファイル(UTF-8エンコード)内の、 12,345円(価格) という文字列内より、 正規表現(ActivePerl)で、 円(価格) 文字列だけをマッチさせようとしています。 たとえば、 my $Str = "12,345円(価格)"; if($Str =~ /.*\d円(価格)/){ # マッチOK処理 } または、 if($Str =~ /円(価格)/){ # マッチOK処理 } など、いろいろ試しましたが、 マッチしない状況です。 そこでご質問ですが、 どのようにすれば、マッチ出来ますでしょうか。 以上になります。 宜しくお願いいたします。

  • grepでのグルーピングの扱いについて

    複数のグルーピングされた正規表現にマッチする文字列を取り出したいと思っています。 GNU awkコマンドではできるようですが、grepコマンドだけでも可能でしょうか? ■例 # 対象文字列: str="bash dash zsh" # 正規表現: re="([^ ]).+[ ]([^ ]).+[ ]([^ ]).+" # 欲しい結果(グルーピングされた正規表現にマッチする文字列) 1番目のグルーピングに対して: b 2番目のグルーピングに対して: d 3番目のグルーピングに対して: z ■環境 $ grep --version grep (GNU grep) 2.16 よろしくお願いします。

専門家に質問してみよう