التجميع أمام النظرة الخلفية الإيجابية غير متطابق

StackOverflow https://stackoverflow.com/questions/1805305

  •  05-07-2019
  •  | 
  •  

سؤال

خذ الكود التالي:

$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);

أحتاج إلى الحصول على موضع NAME وFUNC وكل P ضمن الهدف $ (وبالتالي PREG_OFFSET_CAPTURE).يعمل هذا النمط مع Ps، ولكنه لا يتطابق مع أي من المجموعتين المُسميتين "ruleName" أو "funcName".

ماذا ينقصني؟

شكرًا.

هل كانت مفيدة؟

المحلول

أعتقد أنني وجدت السبب.

  1. تعتبر المراجع الخلفية المسماة اختيارية.
  2. إذا كانت متطابقة (وفي المحاولة الأولى تطابقت)، ​​فإن محرك التعبير العادي يقف على يسار "LPAREN".
  3. الرمز المميز التالي الذي يحاول محرك regex مطابقته هو حرف مسافة.وذلك لأن التعبير lookbehind (?<=LPAREN) لا يستهلك الأحرف في السلسلة.
  4. لا يمكن أن يتطابق مع المساحة نظرًا لوجود حرف L
  5. يتجاهل محرك regex المطابقات الاختيارية من 2.ويستمر حتى يجد المساحة التالية.
  6. إنه يتطابق ويستمر في المطابقة منذ ذلك الحين فصاعدًا، ويلتقط كل شيء Pس.لكن كان لا بد من التخلي عن المجموعات المذكورة حتى ينجح هذا الأمر.

لست متأكدًا من سبب حاجتك إلى النظرة الخلفية.ماذا عن

/(?P<ruleName>NAME )?(?P<funcName>FUNC )?(?:LPAREN )(?:(?P<arg1>P))|(?P<args>P)(?=(?: RPAREN)|(?: COMMA))/
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top