Проблема (не) жадный RegExp - PullRequest
       44

Проблема (не) жадный RegExp

3 голосов
/ 28 февраля 2010

Рассмотрим следующие строки:

1: cccbbb

2: cccaaabbb

Я бы хотел закончить такими матчами:

1: Array
(
    [1] => 
    [2] => bbb
)

2: Array
(
    [1] => aaa
    [2] => bbb
)

Как я могу сопоставить оба в одном RegExp?
Вот моя попытка:

#(aaa)?(.*)$#

Я перепробовал много вариантов жадных и неадекватных модификаций, но это не сработало. Как только я добавлю «?» все соответствует в [2]. Нечестивость [2] не помогает.

Мой RegExp работает должным образом, если я опускаю 'ccc', но я должен разрешить другие символы в начале ...

Ответы [ 5 ]

3 голосов
/ 28 февраля 2010
/(aaa)?((.)\3*)$/

Там будет дополнительный [3], хотя. Я не думаю, что это проблема.

1 голос
/ 28 февраля 2010

Спасибо за мозговой штурм, ребята! Я наконец-то смог выяснить, что работает:

^(?:([^a]*)(aaa))?(.*)$
0 голосов
/ 28 февраля 2010

сделать так:

$sPattern = "/(aaa?|)(bbb)/";

это хорошо работает.

0 голосов
/ 28 февраля 2010

это будет соответствовать группам, но это не очень гибко, вы можете добавить немного больше деталей о том, что вам нужно сделать. Гораздо проще взять три символа за раз и оценить их.

Также я проверил это в Poweshell, который имеет немного другой вкус регулярных выражений.

(а {3,3}) * (б {3,3})

0 голосов
/ 28 февраля 2010

вот способ без регулярных выражений. найдите и разбейте «aaa», если найдено, затем сохраните оставшуюся часть правой части «aaa» в массиве.

$str="cccaaabbb";
if (strpos($str,"aaa")!==FALSE){
   $array[]="aaa";
   $s = explode("aaa",$str);
   $array[]=end($s);
}
print_r($array);

выход

$ php test.php
Array
(
    [0] => aaa
    [1] => bbb
)

Что касается [1], в зависимости от ваших критериев, когда «aaa» не найден, это может быть так же просто, как получить подстроку из символа 4 и далее с помощью strpos ().

...