2013-07-21 4 views
1

У меня есть строка строка, которая выглядит какRegular Expression Matching - Треки

A GOMUP 59/20 61/30 63/40 64/50 64/60 MUSVA DUTUM 

Я пытаюсь написать регулярное выражение, которое соответствует этой строке, и возвращает каждый из ни один пространственном текста в массиве. Он должен обеспечить, чтобы первая буква была 1 цифрой.

Regex Я пытался не работает, как я ожидал бы

#^([A-Z])(?:\s(\S+))+# 

Возвращает

array(3) { 
    [0]=> 
    array(1) { 
    [0]=> 
    string(49) "A GOMUP 59/20 61/30 63/40 64/50 64/60 MUSVA DUTUM" 
    } 
    [1]=> 
    array(1) { 
    [0]=> 
    string(1) "A" 
    } 
    [2]=> 
    array(1) { 
    [0]=> 
    string(5) "DUTUM" 
    } 
} 

Я ожидаю, что/хотел бы вернуться

array(10) { 
    [0]=> 
    array(1) { 
    [0]=> 
    string(49) "A GOMUP 59/20 61/30 63/40 64/50 64/60 MUSVA DUTUM" 
    } 
    [1]=> 
    array(1) { 
    [0]=> 
    string(1) "A" 
    } 
    [2]=> 
    array(1) { 
    [0]=> 
    string(5) "GOMUP" 
    } 
    [3]=> 
    array(1) { 
    [0]=> 
    string(5) "59/20" 
    } 
    [4]=> 
    array(1) { 
    [0]=> 
    string(5) "61/30" 
    } 
    [5]=> 
    array(1) { 
    [0]=> 
    string(5) "63/40" 
    } 
    [6]=> 
    array(1) { 
    [0]=> 
    string(5) "64/50" 
    } 
    [7]=> 
    array(1) { 
    [0]=> 
    string(5) "64/60" 
    } 
    [8]=> 
    array(1) { 
    [0]=> 
    string(5) "MUSVA" 
    } 
    [9]=> 
    array(1) { 
    [0]=> 
    string(5) "DUTUM" 
    } 
} 

Как это может быть достигнуты? Я использую preg_match в PHP.

+0

Посмотрев на ваш пример, похоже на 'explode ('', $ str)' должен делать или я что-то упускаю? – elclanrs

+0

Но Id нравится, чтобы первая была только 1 цифрой. Я знаю, что могу сделать что-то вроде strlen ($ arr [0]) == 1. Но я не понимаю, почему я не могу сделать это в Regex? – craig1231

+0

Первый символ не является цифрой, это письмо. – Barmar

ответ

2

Чтобы разделить вашу строку и проверить, что первая позиция одна буква в то же время, вы можете использовать этот шаблон:

$pattern = '~^[A-Z]\b|\G\s+\K\S+~'; 

$subject = 'A GOMUP 59/20 61/30 63/40 64/50 64/60 MUSVA DUTUM'; 

preg_match_all($pattern, $subject, $matches); 

print_r($matches[0]); 

Вы получаете :

Array 
(
    [0] => A 
    [1] => GOMUP 
    [2] => 59/20 
    [3] => 61/30 
    [4] => 63/40 
    [5] => 64/50 
    [6] => 64/60 
    [7] => MUSVA 
    [8] => DUTUM 
) 

Если я тестирую строку ZZ A GOMUP 59/20 61/30 63/40 64/50 64/60 MUSVA DUTUM, шаблон не работает, и результат не возвращается.

Однако у вас есть возможность найти первую подстроку, которая начинается с одной буквы, используя эту модель:

$pattern = '~^(?>\S{2,}\s+)*\K[A-Z]\b|\G\s+\K\S+~'; 



pattern1 детали:~^[A-Z]\b|\G\s+\K\S+~

~   # pattern delimiter 
^   # begining of the string anchor 
[A-Z]\b # single uppercase letter with a word boundary 
|   # OR 
\G   # contiguous match from the last 
\s+  # one or more white characters (spaces, tab, newlines...) 
      # which can be replaced by ' +' for your example string 
\K   # reset the match before (remove the spaces from the result) 
\S+  # all that is not a space 
~   # pattern delimiter 

ТЕСТ2 детали:~^(?>\S{2,}\s+)*\K[A-Z]\b|\G\s+\K\S+~

~   # pattern delimiter 
^   # begining of the string anchor 
(?>  # open a group (atomic here but you can use '(?:' instead) 
    \S{2,} # a non space character repeated at least two times 
    \s+  # one or more spaces 
)*   # repeat the group zero or more times 
\K   # reset the begining of the match 

и после него, как pattern1.

0

Регулярные выражения в PHP не допускают переменное количество согласованных групп, поэтому вам придется писать группу для каждой части строки. См. http://www.regular-expressions.info/captureall.html

Было бы проще разделить строку пробелами с помощью explode или preg_split и только затем выполнить дополнительные проверки.

0
if (preg_match_all('#([A-Z]+)|([\d]+/[\d]+)#', $text, $matches)){ 
    print_r($matches[0]); 
} 

Выход:

Array 
(
    [0] => A 
    [1] => GOMUP 
    [2] => 59/20 
    [3] => 61/30 
    [4] => 63/40 
    [5] => 64/50 
    [6] => 64/60 
    [7] => MUSVA 
    [8] => DUTUM 
)