PHP5.1.6で正規表現の質問です。


『I79C-1898235197 テスト文字』

このような文字列があるとします。
一番左は英字の大文字'I'です。
次に整数の数字が何桁(この例では79)か続き、次に英字の大文字'C'があります。
次に数字が何桁(この例では-1898235197)か続き、次に半角スペースが入り、マルチバイトと続きます。
上記例の2箇所の数字を抜き、2つの変数に代入したいのですがどのように書けばいいでしょうか?

1.『』は含まれません。
2.英字大文字の'I'と'C'は必ず2箇所数字の頭にそれぞれつきます。
3.2箇所の数字はいずれも何桁か判らずマイナスの可能性もあります。
4.半角スペースはない場合もありますが、2つめの数字の次は必ず英字かマルチバイトとなっています。

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/04/15 20:54:05
  • 終了:2011/04/20 13:24:15

ベストアンサー

id:windofjuly No.3

うぃんど回答回数2625ベストアンサー獲得回数11492011/04/15 22:19:57

ポイント38pt

1つだけ抜き出す例

<?php
$text = 'I79C-1898235197 テスト文字';
if (preg_match('!I(\d+)C(-?\d+)!', $text, $m)) {
    echo $m[1];
    echo ':'; // 見やすくするための区切り文字
    echo $m[2];
    echo "<br />\n"; // 見やすくするための改行コード
} else {
    echo '適合しませんでした';
}

一度に沢山抜き出す例

<?php
$text =<<<text_end
I79C-1898235197 テスト文字
I80C123456789 テスト文字
I81C987654321Aテスト文字
text_end;
if (preg_match_all('!I(\d+)C(-?\d+)!', $text, $m)) {
    foreach($m AS $v) {
        echo $v[1];
        echo ':'; // 見やすくするための区切り文字
        echo $v[2];
        echo "<br />\n"; // 見やすくするための改行コード
    }
} else {
    echo '適合しませんでした';
}
id:seadwell

パーフェクトです。

動作を確認しました。

正規表現はネットで何度も例文を探しますが応用が利きません。

皆さんのお答えを照らし合わせ訓練したいと思います。

ありがとうございました。

2011/04/15 23:10:32

その他の回答(3件)

id:HowAreYou No.1

HowAreYou回答回数91ベストアンサー獲得回数172011/04/15 22:08:40

ポイント13pt

こういうことでしょうか?

<?php
$str = 'I79C-1898235197 テスト文字』' ;

preg_match_all('/\d+/', $str, $mat) ;

list($a, $b) = $mat[0] ;
id:seadwell

ご回答ありがとうございます。

先ほどは失礼しました。

今実行しましたら、$aに79、$bには1898235197が入っていました。

マイナス符号もつけて、-1898235197が入ってほしいのです。

2011/04/15 22:28:14
id:asuka645 No.2

あすか回答回数856ベストアンサー獲得回数972011/04/15 22:03:47

ポイント26pt

下記のようなプログラムになります。

取り出したい数字(正数、負数、小数)は変数 $s1, $s2 に入ります。

<?php
$str = 'I79C-1898235197 テスト文字';
$pat = "/I([\-\.0-9]+)C\-([\-\.0-9]+)/iu";
preg_match($pat, $str, $arr);
$s1 = $arr[1];
$s2 = $arr[2];
echo $s1 . "<br />\n";
echo $s2 . "<br />\n";
?>
id:seadwell

いつもありがとうございます。

質問が判りつらいですね。

こちらも$s2 でマイナス符号が抜けてしまいました。

マイナス符号は必要です。

また、質問に説明が抜けていましたが整数ですので、少数対処は今回は必要なかったです。

でもありがとございました。

2011/04/15 22:50:58
id:windofjuly No.3

うぃんど回答回数2625ベストアンサー獲得回数11492011/04/15 22:19:57ここでベストアンサー

ポイント38pt

1つだけ抜き出す例

<?php
$text = 'I79C-1898235197 テスト文字';
if (preg_match('!I(\d+)C(-?\d+)!', $text, $m)) {
    echo $m[1];
    echo ':'; // 見やすくするための区切り文字
    echo $m[2];
    echo "<br />\n"; // 見やすくするための改行コード
} else {
    echo '適合しませんでした';
}

一度に沢山抜き出す例

<?php
$text =<<<text_end
I79C-1898235197 テスト文字
I80C123456789 テスト文字
I81C987654321Aテスト文字
text_end;
if (preg_match_all('!I(\d+)C(-?\d+)!', $text, $m)) {
    foreach($m AS $v) {
        echo $v[1];
        echo ':'; // 見やすくするための区切り文字
        echo $v[2];
        echo "<br />\n"; // 見やすくするための改行コード
    }
} else {
    echo '適合しませんでした';
}
id:seadwell

パーフェクトです。

動作を確認しました。

正規表現はネットで何度も例文を探しますが応用が利きません。

皆さんのお答えを照らし合わせ訓練したいと思います。

ありがとうございました。

2011/04/15 23:10:32
id:asuka645 No.4

あすか回答回数856ベストアンサー獲得回数972011/04/15 23:03:53

ポイント13pt

ご指摘に沿うよう、改良しました。

<?php
$str = 'I79C-1898235197 テスト文字';
$pat = "/I([\-0-9]+)C([\-0-9]+)/iu";
preg_match($pat, $str, $arr);
$s1 = $arr[1];
$s2 = $arr[2];
echo $s1 . "<br />\n";
echo $s2 . "<br />\n";
?>
id:seadwell

ご回答ありがとうございます。

まだ試していませんが後ほどじっくり勉強したいと思います。

2011/04/20 13:23:48
  • id:HowAreYou
    すみません、ちょっと見落としてましたね。
    preg_match_all('/[-\d]+/', $str, $mat) ;
    で。
  • id:windofjuly
    うぃんど 2011/04/15 22:53:05
    訂正
    一度に沢山抜き出す例のほうで第四引数(PREG_SET_ORDER)が抜けてました
    if (preg_match_all('!I(\d+)C(-?\d+)!', $text, $m, PREG_SET_ORDER)) {
  • id:sayo221sayo
    そうとう慌ててるな ( ´,_ゝ`)プッ
  • id:windofjuly
    うぃんど 2011/04/16 00:15:32
    >正規表現はネットで何度も例文を探しますが応用が利きません
     
    難しく考えずに「先頭から順に割り振る」ようにすれば多くの場合は完成します
     
    I  固定文字 I
    79 何ケタかの整数 ¥d+
    C  固定文字 C
    -  マイナス符号が付くかもしれない -?
    1898235197 何ケタかの整数 ¥d+
     
    上記を1つに繋げて「後で参照する部分を()でくくる」と回答のような表現になります
  • id:seadwell
    HowAreYou さん、windofjuly さん、コメントでのフォローありがとうございます。
    windofjuly さん、わかり易い解説までつけていただいてありがとうございます。
    暗号みたいな記号文字が羅列していると拒否反応が出てきます。人により表現が違うので余計こんがらがります。
    なるほどですねー。
    解説を参考に訓練します。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません