正则表达式在分隔数后找到3个空格之间的数字?

时间:2013-07-04 10:32:03

标签: php regex

我有一个带数字的字符串,我有一个模式来匹配字符串并获取该字符串的具体数字。

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个空格之间的数字,即2个,21个或210个。

5 个答案:

答案 0 :(得分: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。可以找到演示here

答案 1 :(得分: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);
}

答案 2 :(得分:0)

如果你只是在电话号码和空格后面的数字之后,你可以将表达式减少到

\d{3}-\d{3}-\d{4}\s(\d+)

答案 3 :(得分:0)

Haven测试它,但这应该做的工作:

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:)

答案 4 :(得分:0)

同意其他回复,regexp似乎毫无用处(爆炸可能更快),但如果你需要它,为什么不使用简单的东西:

/([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