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 个空格之间的数字,在这个例子中是 2、21 或 210。

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

如果您只在电话号码和空格后面的数字之后,您可以将表达式缩减为

\d{3}-\d{3}-\d{4}\s(\d+)
于 2013-07-04T10:38:13.110 回答
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

我不会为此使用正则表达式。改用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 回答