質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

2147閲覧

小数点にも対応して数値を分割する方法

aaaaaaaa

総合スコア501

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2016/08/08 11:15

編集2016/08/09 05:17

下記のソースは、数値を2進数の正規表現で認識した後、マッチした部分を境に指定した文字列を分割させるpreg_splitで、分割された2進数の数値それぞれに、正数の2^x或いは、負数の2^-xを掛け10進数にしようと思ったのですが、
小数点に対応しきれません。
分割する正規表現の条件は、まだ読んでいない右部分に数値があって、既に読んだ部分に数値がある位置です。数値と数値の間に小数点が入るとこの条件が満たせなくなり、
分解された数値が入る配列に「x.y」のような値が代入されてしまうのです。どうすると、小数点があった場合も含めた「まだ読んでいない右部分に数値があって、既に読んだ部分に数値がある位置」という条件を作れるのでしょうか。

php

1function henkan($nisinsu) { 2 //二進数を受け取ったら、数字を一つ一つ分解し、2^-x乗の計算をする。小数の二進数の可能性もあるので\.で対応する。 3 //マッチした部分を境に区切るのがpreg_splitなので数値と数値の間の"位置"にマッチするよう作る。 4 5 //先読みでまだ、読んでいない右側の部分に数値があり、尚且つ既に読んだ左側に数値がある位置にマッチする。 6 //また先読みカッコ、後読みカッコの間には、0回から1回だけという限定的な条件で、文字の「.」とそれに連なる数字が一個(.x)あってもマッチする。 7 $result = preg_split("/(?=\d)(\.)?(?<=\d)/", $nisinsu); 8 9 print "●result: ●result[0]「".$result[0].//1 10 "」●result[1]「 ".$result[1].//0 11 "」●result[2]「 ".$result[2].//1.1 12 "」●result[3]「 ".$result[3]."」<hr>";//空。本来ここに101.1の小数点第一位である1が来てほしい 13 14} 15 16print henkan(101.1);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

matobaa

2016/08/08 13:35

ちょっとやりたいことがよくわからないのですが、101.1 と 10.11 をどう区別して配列に入れたいんでしょうか。
guest

回答2

0

ベストアンサー

やりたそうなことに対して、無理に難しくやられているように見えます。
単に文字をバラバラにすればよいのではありませんか。

php

1$result = preg_split("//", $nisinsu, -1, PREG_SPLIT_NO_EMPTY);

の結果ではダメなのでしょうか。

正規表現のお勉強でしたら、前も後ろも (数 もしくは .) と考えてみてください。

投稿2016/08/08 23:54

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaaaaaa

2016/08/09 11:05

ご回答有難うございます。 仰るとおりでした。正規表現に何も指定しないことが正解だったとは。 しかし、なぜ正規表現に何も指定しないと思い通りに数値を分割できたのでしょうか。 101.1という数値と数値の間、数値と小数点の間にマッチングしたということなのでしょうか。
退会済みユーザー

退会済みユーザー

2016/08/10 02:21

文字列の先頭と末尾と文字間にマッチするので |1|0|1|.|1|  と|の部分で切ることになりますね。 このままだと最初と最後に空の文字列がでるので PREG_SPLIT_NO_EMPTYをつけて抑制しています。
aaaaaaaa

2016/08/10 11:28

ご返答有難うございます。 何も指定しなくても、正規表現は文字と文字と間を認識してくれるのですね。とても勉強になりました。
guest

0

最終的に得たい形がよくわからないので適切な回答がしづらいです。
コードのコメントが参考になるかと思いましたが、肝心の"."以降の記載が
//空。本来ここに4が来てほしい
とよくわからない記載になっています。

配列の数から推測して、
$result[0]=1
$result[1]=0
$result[2]=1
$result[3]=1
の結果を得たいのであれば、事前に$nisinsuから"."を除去してしまえばいいのではないかと思います。
$nisinsu = str_replace('.','',$nisinsu);
ただし、これでは少数位置が失われてしまうので、あとあと困りそうな気がします。

$result[0]=1
$result[1]=0
$result[2]=1
$result[3]=.
$result[4]=1
のような結果を期待されるのであれば、noricyan2さん提示の方法でできるのではないでしょうか。

追記

条件として
「まだ読んでいない右部分に数値があって、既に読んだ部分に数値がある位置」
の言葉をそのままとらえると、正規表現としては
(?<=\d).(?=\d)
になると思います。(左側が数値で、右側も数値となる一文字)

これだけだと、例えば123.4を対象とした場合"2"と"."がヒットします。

取得対象を数値に限定して
(?<=\d)\d(?=\d)
とすると、"2"だけがヒットします。

目的の形にいちばん近い正規表現は
(?<=[\d\.])?\d(?=[\d])?
「左側に1or0文字の数字またはピリオドがあり、右側に1or0文字の数字がある数値」でしょうか。

投稿2016/08/09 02:54

編集2016/08/09 03:28
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aaaaaaaa

2016/08/10 11:27

ご回答有難うございました。 追記のおかげで勘違いしておったところを救っていただけました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問