regroupement devant lookbehind positif ne correspondant pas
Question
Prenez le code suivant:
$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);
Je dois obtenir la position de NAME, FUNC et chaque P dans la cible $ (donc PREG_OFFSET_CAPTURE). Le modèle fonctionne pour Ps, mais il ne correspond à aucun des groupes nommés & Quot; ruleName & Quot; ou & "; funcName &";.
Qu'est-ce qui me manque?
Merci.
La solution
Je pense avoir trouvé la raison.
- Vos références arrières nommées sont facultatives.
- S'ils concordent (et au premier essai, ils le font), le moteur des expressions rationnelles se tient à gauche de & "LPAREN &".
- Le prochain jeton que le moteur d’expression rationnelle essaie de faire correspondre est un caractère espace. En effet, l'expression lookbehind
(?<=LPAREN)
ne consomme pas de caractères dans la chaîne. - Il ne peut pas correspondre à l'espace car il y a un L
- Le moteur d'expression régulière abandonne les correspondances facultatives à partir de 2. et continue jusqu'à ce qu'il trouve l'espace suivant.
- Il correspond et continue à correspondre à partir de là, capturant tous les
P
s. Mais les groupes nommés ont dû être abandonnés pour que cela fonctionne.
Je ne sais pas pourquoi vous avez besoin de regarder derrière vous. Que diriez-vous
/(?P<ruleName>NAME )?(?P<funcName>FUNC )?(?:LPAREN )(?:(?P<arg1>P))|(?P<args>P)(?=(?: RPAREN)|(?: COMMA))/
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow