2013-07-04 3 views
1

У меня есть строка с числами, и у меня есть шаблон для соответствия строке и получения определенных чисел этой строки.regex найти номер между 3 пробелами после номера с разделителем?

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 в этом примере.

ответ

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.

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); 
} 
+0

не 'взрываются бы («\ п», str_replace («\ г»,«», $ строка))' быть лучше, так как данные могут поступать из источника, который не запускается такая же оперативная система? Если данные поступают из источника Linux, 'PHP_EOL', скорее всего, будет' \ n' (из источника), но сервер, на котором работает PHP, может полагать, что 'PHP_EOL' является' \ r \ n' и, следовательно, не взрывает ничего вообще. – h2ooooooo

+0

@ h2ooooooo Да, разделитель строк будет нуждаться в особом внимании, если файл не поступает из linux box, а php работает на linux. 'PHP_EOL' - всего лишь пример, и мне больше всего нравится в моих ответах. потому что если я просто напишу '\ r \ n', он не будет работать в UNIX, если я наберу' \ n', он не будет работать в Windows. Вы не можете сделать это правильно, не зная больше о приложении. Я думаю, что 'PHP_EOL' хотя бы выразителен – hek2mgl

0

если вы только после цифр после номера телефона и пространство, вы могли бы сократить выражение

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

да, но мне нужно вернуть его как индивидуальный номер, как и другие фильтры, чтобы иметь элемент в массиве совпадений –

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]; 
} 

Edit: Короткий тест показывает, что is't работает http://regexr.com?35f81 :)

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

Смежные вопросы