Problem (un-) açgözlü RegExp

5 Cevap php

Aşağıdaki Strings düşünün:

1: cccbbb

2: cccaaabbb

Ben bu gibi maçları ile bitirmek istiyorum:

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

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

How can I match both in one RegExp?
Here's my try:

#(aaa)?(.*)$#

Ben açgözlü ve ungreedy değişiklikler pek çok çeşidi denedim ama işe yaramaz. En kısa zamanda ben eklemek gibi '?' Her şey [2] olarak eşleştirilir. Yapımı [2] ungreedy yardımcı olmuyor.

Ben 'ccc' atlarsanız beklendiği gibi benim RegExp çalışır, ama ben başında diğer karakterler izin vermek zorunda ...

5 Cevap

/(aaa)?((.)\3*)$/

Olsa bir ekstra [3] olacaktır. Ben bir sorun olduğunu sanmıyorum.

Burada beyin fırtınası çocuklar için teşekkür ederiz! Sonunda bunu çalışıyor dışında bir şey anlamaya mümkün olmuştur:

^(?:([^a]*)(aaa))?(.*)$

Burada olmayan bir regex yoludur. bulursa arama ve "AAA" split, ardından diziye "AAA" sağ tarafında kalan depolar.

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

çıktı

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

Gibi [1], "aaa" bulunamadı kriteriniz ne bağlı olarak,) itibaren (strpos kullanarak karakteri 4 altdize almak kadar basit olabilir.

Bu gruplar maç olacak ama onun çok esnek değil yapmanız gereken biraz daha ayrıntı koyabilirsiniz. Bu üç karakter, bir süre kapmak ve onları değerlendirmek için çok daha kolay olabilir.

Ayrıca ben regex biraz farklı bir lezzet var poweshell bu test.

(A {3,3}) * (b {3,3})

Bu gibi yapın:

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

Bu iyi çalışıyor.