2016-11-17 4 views
-1

Я пытаюсь захватить набор строк, используя регулярные выражения. Струны имеют следующий форматRegex для сбора данных

CID _At     1 2 99 1,198,498,377   414   0  0  0  3,694 

Выражение, которое я придумал это

[A-Za-z][a-z0-9A-Z_-]*\s*[0-6]\s*[0-4]\s\s[\s\d]\d\s*[0-9,]*\s*[0-9,]*\s*[0-9,]*\s*[0-9,]*\s*0\s*[0-9,]* 

Хотя это выражение работает для меня, и дает необходимую отдачу, я чувствую, что он не оптимизирован ,

Может кто-нибудь помочь мне оптимизировать выражение?

+0

вы можете играть с регулярным выражением здесь: https://regex101.com/ r/86DiBO/1 Он также показывает, сколько шагов требуется. –

+0

Привет @jace Я пытаюсь извлечь данные из файла. Файл содержит несколько строк, похожих на тот, который я упоминал, с разными значениями и именами, а также некоторые другие данные, которые мне не нужны. –

ответ

1
<?php 
$text = 'CID _At     1 2 99 1,198,498,377   414   0  0  0  3,694'; 
preg_match("/^[A-Z]+\s+[A-Za-z_]+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+[0-9,]+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+[0-9]+\s+[0-9,]+$/", $text, $m); 
print_r($m); 
preg_match("/^([A-Z]+)\s+([A-Za-z_]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9,]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9]+)\s+([0-9,]+)$/", $text, $m); 
print_r($m); 
/* 
Output: 
Array 
(
    [0] => CID _At     1 2 99 1,198,498,377   414   0  0  0  3,694 
) 
Array 
(
    [0] => CID _At     1 2 99 1,198,498,377   414   0  0  0  3,694 
    [1] => CID 
    [2] => _At 
    [3] => 1 
    [4] => 2 
    [5] => 99 
    [6] => 1,198,498,377 
    [7] => 414 
    [8] => 0 
    [9] => 0 
    [10] => 0 
    [11] => 3,694 
) 

*/ 

удалить *, и если вам нужно группу внутренних совпадений с() например, в PHP, если вам нужна длина, заменить "+" на "{1}" (длина 1 символ)

, если вам нужно, минимум 1 и максимум 3 {1,3}

если вам нужно минимум 1 и максимум бесконечна {1}

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