regex - w3schools - regular expression شرح




هل هناك تعبير عادي لاكتشاف تعبير عادي صحيح؟ (6)

هل من الممكن اكتشاف تعبير عادي صحيح مع تعبير عادي آخر؟ إذا كان الأمر كذلك ، فيرجى تقديم مثال الكود أدناه.


جرب هذه...

//regular expression for email
    var pattern = /^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    if(pattern.test(email)){
        return true;
    } else {
        return false;
    }

سؤال جيد. لا يمكن للغات العادية الحقيقية أن تقرر بشكل تعسفي بعمق تداخل بين قوسين. بمعنى ، إذا كانت الأبجدية الخاصة بك تحتوي على '(' و ')' فإن الهدف هو تحديد ما إذا كانت سلسلة من هذه الكلمات تحتوي على أقواس مطابقة تم تشكيلها بشكل جيد. وحيث أن هذا هو مطلب ضروري للتعبيرات العادية فإن الإجابة هي لا.

ومع ذلك: إذا قمت بتخفيف المتطلبات وإضافة العودية ، فربما يمكنك القيام بذلك. والسبب هو أن التكرار يمكن أن يكون بمثابة "مكدس" مما يتيح لك "حساب" عمق التعشيش الحالي عن طريق الضغط على هذا المكدس.

وقد كتب روس كوكس أطروحة رائعة على تنفيذ محرك regex: يمكن أن يكون التعبير العادي مطابقة بسيطة وسريعة


لا إذا كنت تتحدث بشكل صارم عن التعبيرات العادية ولا تتضمن بعض تطبيقات التعبير العادية التي هي في الواقع قواعد خالية من السياق.

هناك حد واحد للتعبيرات العادية ، مما يجعل من المستحيل كتابة تعبير عادي يتطابق مع الكل فقط. لا يمكنك مطابقة تطبيقات مثل الأقواس التي يتم إقرانها. تستخدم regexes العديد من هذه البنى ، دعونا نأخذ [] كمثال. عندما يكون هناك [يجب أن يكون هناك تطابق]. بسيطة بما فيه الكفاية لتعبير عادي "[. *]".

ما يجعل من المستحيل على regexes هو أنه يمكن أن تكون متداخلة. كيف يمكنك كتابة تعبير عادي يطابق الأقواس المتداخلة؟ الجواب لا يمكنك بدون تعبير طويل غير محدود. يمكنك مطابقة أي عدد من الأشرطة المتداخلة من خلال القوة الغاشمة ولكن لا يمكنك مطلقًا مطابقة مجموعة طويلة متداخلة من الأقواس المتداخلة.

وغالبا ما يشار إلى هذه القدرة على العد (كنت تحتسب عمق التعشيش). ليس لدى التعبير العادي بالتعريف القدرة على العد.

تعديل: انتهى بكتابة مشاركة مدونة حول هذا الموضوع: قيود التعبير العادي


من غير المرجح.

try..catch في محاولة .. try..catch أو أيا كان يوفر لغتك.


يمكنك تقديم تعبير عادي إلى preg_match والذي سيظهر false إذا كان التعبير العادي غير صالح. لا تنسَ استخدام "@" لمنع رسائل الخطأ:

@preg_match($regexToTest, '');
  • سيعود 1 إذا كان regex "/".
  • سيعود 0 إذا كان regex بخير.
  • سيعود كاذبة خلاف ذلك.

/
^                                             # start of string
(                                             # first group start
  (?:
    (?:[^?+*{}()[\]\\|]+                      # literals and ^, $
     | \\.                                    # escaped characters
     | \[ (?: \^?\\. | \^[^\\] | [^\\^] )     # character classes
          (?: [^\]\\]+ | \\. )* \]
     | \( (?:\?[:=!]|\?<[=!]|\?>)? (?1)?? \)  # parenthesis, with recursive content
     | \(\? (?:R|[+-]?\d+) \)                 # recursive matching
     )
    (?: (?:[?+*]|\{\d+(?:,\d*)?\}) [?+]? )?   # quantifiers
  | \|                                        # alternative
  )*                                          # repeat content
)                                             # end first group
$                                             # end of string
/

هذا تعبير عادي ، ولا يدعمه العديد من محركات regex. يجب أن يعتمد عليها PCRE منها.

بدون فراغات وتعليقات:

/^((?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>)?(?1)??\)|\(\?(?:R|[+-]?\d+)\))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*)$/

.NET لا يدعم العودية مباشرة. (يبني (?1) و (?R) .) يجب أن يتم تحويل العودية إلى حساب المجموعات المتوازنة:

^                                         # start of string
(?:
  (?: [^?+*{}()[\]\\|]+                   # literals and ^, $
   | \\.                                  # escaped characters
   | \[ (?: \^?\\. | \^[^\\] | [^\\^] )   # character classes
        (?: [^\]\\]+ | \\. )* \]
   | \( (?:\?[:=!]
         | \?<[=!]
         | \?>
         | \?<[^\W\d]\w*>
         | \?'[^\W\d]\w*'
         )?                               # opening of group
     (?<N>)                               #   increment counter
   | \)                                   # closing of group
     (?<-N>)                              #   decrement counter
   )
  (?: (?:[?+*]|\{\d+(?:,\d*)?\}) [?+]? )? # quantifiers
| \|                                      # alternative
)*                                        # repeat content
$                                         # end of string
(?(N)(?!))                                # fail if counter is non-zero.

ضغط:

^(?:(?:[^?+*{}()[\]\\|]+|\\.|\[(?:\^?\\.|\^[^\\]|[^\\^])(?:[^\]\\]+|\\.)*\]|\((?:\?[:=!]|\?<[=!]|\?>|\?<[^\W\d]\w*>|\?'[^\W\d]\w*')?(?<N>)|\)(?<-N>))(?:(?:[?+*]|\{\d+(?:,\d*)?\})[?+]?)?|\|)*$(?(N)(?!))






regex