私は次のような文字列を持っています:
$str1 = "12 ounces";
$str2 = "1.5 ounces chopped;
文字列から小数かどうか(12または1.5)の量を取得し、直前の測定値(オンス)を取得したいと思います。
かなり初歩的な正規表現を使用して測定値を取得することはできましたが、小数/整数を取得することで問題が発生しました。
ご協力いただきありがとうございます!
データを取得したいだけの場合は、緩い正規表現を使用できます。
([\d.]+)\s+(\S+)
([\d.]+)
:[\d.]+
厳密に数字のシーケンスと一致し(または一致.
することを意味しますが、これらのケースは一般的ではなく、これはデータを取得するためだけです)、括弧は一致したテキストをキャプチャすることを示します。ここは文字クラス内にあるため、エスケープする必要はありません。4.5.6
....
.
[]
\s+
任意のスペースと非スペース文字の最大シーケンス (貪欲な量指定子による) が続きます\S+
(非スペースは実際には非スペースです: スペース、タブ、改行、改行文字を除く Unicode のほとんどすべてに一致します)。
最初のキャプチャ グループで番号を取得し、2 番目のキャプチャ グループでユニットを取得できます。
数を少し厳密にすることができます。
(\d+(?:\.\d*)?|\.\d+)\s+(\S+)
(\d+(?:\.\d*)?|\.\d+)
ので、この部分だけ説明します。これは少し厳密ですが、入力ドメインと要件に応じて、より厳密にするかどうかを決定します。integer 34
、 number に小数部分が一致し、大文字と小文字が区別され3.40000
ます。が過剰に含まれる番号を拒否するか、または のみを含みます。は、 と の2 つの異なるパターンを分離する OR として機能します。.5
34.
.
.
|
\.\d+
\d+(?:\.\d*)?
\d+(?:\.\d*)?
: これは一致し、(暗黙的に) 整数部分の少なくとも 1 つの数字をアサートし、その後にオプション (任意の文字を意味するため.
、エスケープする必要があります) と小数部分 (0 以上の数字を指定できます) が続きます。任意性は最後に で示されます。グループ化とキャプチャに使用できますが、キャプチャが必要ない場合は、キャプチャを無効にするために使用できます (メモリを節約します)。\
.
?
()
(?:)
\.\d+
: のような場合にマッチし.78
ます。.
これは、少なくとも 1 つの ( で示される+
) 数字が後に続くものと一致します。入力文字列から意味のあるものを確実に取得したい場合、これは良い解決策ではありません。有効なデータのみをキャプチャする正規表現を作成する前に、予想されるすべての単位を定義する必要があります。
この正規表現を使用する\b\d+([\.,]\d+)?
コンマまたはドットと次の単語を使用する整数と小数を取得するには、次の正規表現を使用します。
/\d+([\.,]\d+)?\s\S+/