سؤال

أحتاج إلى مطابقة بيانات C ++ Preprocessor. الآن ، قد تمتد البيانات المسبقة على خطوط متعددة:

#define foobar \
    "something glorious"

قد يتم هروب هذا الانزلاق الخلفي النهائي ، لذا فإن النتائج التالية في سطرين منفصلين:

#define foobar \\
No longer in preprocessor.

والسؤال هو كيف يمكنني مطابقة استمرار الخط الصريح بكفاءة. لدي التعبير التالي الذي أنا فكر في يعمل. في الأساس ، يختبر ما إذا كان عدد الانتشار الخلفي غريب. هل هذا صحيح؟ هل يمكن أن يتم ذلك بشكل أكثر كفاءة؟

/
    [^\\]           # Something that's not an escape character, followed by …
    (?<escape>\\*?) # … any number of escapes, …
    (?P=escape)     # … twice (i.e. an even number).
    \\ \n           # Finally, a backslash and newline.
/x

(أنا أستخدم PHP حتى يتم تطبيق قواعد PCRE لكنني أقدر الإجابات في أي regex العامية.)

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

المحلول

أعتقد أنك تجعل الأمر أكثر صعوبة مما يجب أن يكون. جرب هذا:

/
  (?<!\\)    # not preceded by a backslash
  (?:\\\\)*  # zero or more escaped backslashes
  \\ \n      # single backslash and linefeed
/x
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top