1

数字を含む文字列があり、文字列に一致するパターンがあり、この文字列の特定の番号を取得しています。

202-715-1278 2 0.01% 0.30 0.00% $0.00 0.00%
202-715-1278 21 0.01% 0.30 0.00% $0.00 0.00%
202-715-1278 210 0.01% 0.30 0.00% $0.00 0.00%

パターン

\b[0-9]{3}\s*[-]\s*[0-9]{3}\s*[-]\s*[0-9]{4}|(?<!\$)\b[-+]?\d+\.\d+\b(?!%)|(\$\d+(?:\.\d+)?)\b

このパターンは、電話番号、0.30 である最初の浮動小数点数、および価格を返します。
私が必要とするのは、この例では 2、21、または 210 である電話番号の後の 2 つのスペースの間の数字を返すことです。

4

5 に答える 5

1

探している値が文字列のどこにでもあるように見えるので、現在の正規表現は少し奇妙です。さて、正規表現が書かれた方法に従って、あなたは使うかもしれません:

\b[0-9]{3}\s*[-]\s*[0-9]{3}\s*[-]\s*[0-9]{4}|(?<!\$)\b[-+]?\d+\.\d+\b(?!%)|(\$\d+(?:\.\d+)?)\b|\b(?<!\$)(\d+)(?!%|\.)\b

私はビットを追加しました:|\b(?<!\$)(\d+)(?!%|\.)\bちなみに。デモはここにあります。

于 2013-07-04T10:38:46.923 に答える
0

他の回答に同意します。正規表現は役に立たないようです(おそらくより速く爆発します)が、それが必要な場合は、次のような単純なものを使用しないでください:

/([0-9]+-[0-9]+-[0-9]+) ([0-9]+) ([0-9.]+%) ([0-9.]+) ([0-9.]+%) \$([0-9.]+) ([0-9.]+%)/

\1 \2 \3 などにすべてのフィールドがあります。

http://www.regex101.com/r/lX1aW2

于 2013-07-04T10:46:54.233 に答える
0

私はそのために正規表現を使用しません。explode()代わりに使用してください:

// split the lines
$lines = explode(PHP_EOL, $string);

foreach($lines as $line) {
    // split line by spaces
    $record = explode(' ', $line);
    // now you can access every column in the record
    var_dump($record);
}
于 2013-07-04T10:36:40.757 に答える
0

ヘブンはそれをテストしますが、これでうまくいくはずです:

foreach($lines as $line){
    $results=array();
    preg_match('%(\d+-\d+-\d+).*( \d+\.\d+ ).*(\$\d+\.\d+).*%', $line, $results);
    $phone=$results[1];
    $float=$results[2];
    $price=$results[3];
}

編集:短いテストで、動作していないことがわかりましたhttp://regexr.com?35f81 :)

于 2013-07-04T10:45:07.617 に答える
0

電話番号とスペースに続く数字のみを求めている場合は、式を切り詰めることができます

\d{3}-\d{3}-\d{4}\s(\d+)
于 2013-07-04T10:38:13.110 に答える