Pozitif Geriye bakan eşleşmeyen önünde gruplama

1 Cevap php

Aşağıdaki kodu atın:

$target = 'NAME FUNC LPAREN P COMMA P COMMA P RPAREN';
//$target = 'NAME FUNC LPAREN P RPAREN';
//$target = 'NAME FUNC LPAREN RPAREN';
$pattern = '/(?P<ruleName>NAME )?(?P<funcName>FUNC )?(?:(?<=LPAREN)(?: (?P<arg1>P))|(?P<args>P)(?=(?: RPAREN)|(?: COMMA)))/';

preg_match_all($pattern,$target,$matches,PREG_OFFSET_CAPTURE|PREG_PATTERN_ORDER);

Ben $ hedef (dolayısıyla PREG_OFFSET_CAPTURE) bünyesinde ADI, FONK ve her P konumunu almak gerekiyor. Desen Ps için çalışır, ancak adlandırılmış gruplar "RuleName" veya "işlevadı" ya uymuyor.

Ne eksik?

Teşekkürler.

1 Cevap

Ben nedenini buldum.

  1. Adlandırılmış geribaşvurularla isteğe bağlıdır.
  2. Onlar (ve yapılacak ilk denemede) uyuyorsa, o zaman regex motoru "LPAREN" solunda duruyor.
  3. Regex motoru eşleştirmeye çalışır sonraki token boşluk karakteridir. Geriye bakan ifadesi (?<=LPAREN) dize karakterleri tüketmek değil çünkü bu.
  4. L var çünkü boşluk maç olamaz
  5. Regex motoru 2'den isteğe eşleşmeleri atar. Ve sonraki boşluk bulana kadar gider.
  6. Bu maçları ve daha sonra eşleşen tüm P s yakalama tutar. Fakat adlı grup bu çalışması için vazgeçmiş gerekiyordu.

Seni Geriye bakan neden ihtiyaç emin değilim. Nasıl hakkında

/(?P<ruleName>NAME )?(?P<funcName>FUNC )?(?:LPAREN )(?:(?P<arg1>P))|(?P<args>P)(?=(?: RPAREN)|(?: COMMA))/