إنشاء كائن regexp:
يمكن إنشاء تعبيرات منتظمة منتظمة مباشرة ، أي الشخصيات المحاطة بالرقابة "/". ومع ذلك ، في بيئة تكون هناك حاجة إلى تغييرات المعلمة ، يعد مُنشئ REGEXP () خيارًا أفضل:
var reg1 =/'/w+'/g ؛
var reg2 = new regexp ('/' // w+/'' ، 'g') ؛
مقارنة بطريقتي الإنشاء ، المعلمة الأولى في RegexP هي السلسلة العادية التي سيتم إنشاؤها. من ناحية ، ليس تمثيلًا مباشرًا للكمية ، لذلك لا يتم إرفاقه بقطع "/" ؛ بدلاً من ذلك ، يجب أن تفلت علامة الاقتباس "" "ورمز الهروب"/"التربيعي في السلسلة.
بالإضافة إلى ذلك ، سواء كانت الكمية المباشرة أو مُنشئ regexp () ، يتم إنشاء كائن RegexP جديد وتعيينه إلى متغير.
أوجه التشابه والاختلاف بين Match () و Exec ():
تعد Match و Exec طرقًا شائعة لمطابقة السلاسل للتعبيرات العادية. الوظائف التي ينفذها الاثنان متشابهة ، مع بعض الاختلافات الدقيقة:
1. كيفية الاستخدام
Match هي طريقة لف الكائنات مع السلاسل ، والاستخدام: string.match (regexp) ؛
EXEC هي طريقة لكائن التعبير العادي ، الاستخدام: regexp.exec (سلسلة) ؛
2. النتائج عاد
عندما لا يقوم RegexP بتعيين العلم العالمي "G":
نتائج عائد كلاهما هي نفسها. هذا هو ، عندما لا تكون هناك قيمة مطابقة ، فإنها تُرجع خالية ، وعندما تكون هناك قيمة مطابقة ، فإنها تُرجع صفيفًا (دعنا نتعامل مع الصفيف). Array [0] عبارة عن سلسلة مطابقة ، صفيف [1] ، صفيف [2] ... يتوافق مع قوسين مطابقة للفرعية في التعبيرات العادية. في الوقت نفسه ، تحتوي الصفيف على خصائصين. يمثل Array.Index الموضع الأولي لسلسلة المطابقة ، ويمثل Array.input السلسلة التي يتم استردادها.
عندما يكون لدى Regexp مجموعة العلم العالمي "G":
تُرجع المباراة صفيف صفيف عندما تكون هناك قيمة. يمثل كل عنصر في المصفوفة جميع الأوتار التي تتطابق ، لذلك لا يوجد المزيد من الأساسيات المطابقة. في هذا الوقت ، لا يوجد لدى الصفيف سمة فهرس وسمة الإدخال.
لا يختلف EXEC عن الأداء دون التسمية العالمية "G". صفيف الصفيف الذي تم إرجاعه ، Array [0] هو سلسلة المطابقة الحالية ، صفيف [1] ، صفيف [2] ... هي سلسلة المطابقة الحالية. في هذا الوقت ، انتبه إلى خاصية LastIndex لكائن REGEXP ، والذي يمثل الموضع الأخير في نهاية السلسلة المطابقة في السلسلة الأصلية. عندما لا تكون هناك نتيجة مطابقة أخرى ، يتم تعيين خاصية LastIndex على 0. لذلك ، يمكنك استخدام LastIndex Loop للعثور على جميع سلاسل المطابقة.
دعم طرق المطابقة المتعددة:
رمز JS
var testStr = "Now test001 test002" ؛ var re =/test (/d+)/ig ؛ var r = "" ؛ بينما (r = re.exec (testStr)) {Alert (r [0] + "" + r [1]) ؛ }بالإضافة إلى ذلك ، يمكنك أيضًا استخدام TestStstr.Match (إعادة) ، ولكن بهذه الطريقة ، لا يوجد خيار لـ G ، ويمكنك الحصول على المباراة الأولى فقط.
1. قواعد التعبير العادية
1.1 الأحرف العادية
الرسائل والأرقام والشخصيات الصينية والمعالم السفلية وعلامات الترقيم التي لم يتم تحديدها على وجه التحديد في الفصول التالية هي "الأحرف العادية". عندما يتطابق حرف عادي في التعبير مع سلسلة ، فإنه يتطابق مع نفس الحرف.
مثال 1: عند تعبير "C" ، عند مطابقة السلسلة "ABCDE" ، فإن النتيجة المطابقة هي: النجاح ؛ المحتوى المطابق هو: "C" ؛ الموضع المطابق هو: ابدأ في 2 وإنه في 3.
مثال 2: عند تعبير "BCD" ، عند مطابقة السلسلة "ABCDE" ، فإن النتيجة المطابقة هي: ناجحة ؛ المحتوى المطابق هو: "BCD" ؛ الموقف المطابق هو: ابدأ في 1 وانتهى في 4.
1.2 شخصيات الهروب البسيطة
بالنسبة لبعض الأحرف غير المريحة للكتابة ، استخدم طريقة إضافة "/" إلى المقدمة. نحن بالفعل على دراية بهذه الشخصيات.
تعبير | مطابق |
/ص ، /ن | يمثل عودة النقل وكسر الخط |
/ر | رموز علامة التبويب |
// | يمثل "/" نفسه |
هناك علامات علامات ترقيم أخرى خاصة للاستخدام في الفصول التالية. بعد إضافة "/" إلى المقدمة ، فإنها تمثل الرمز نفسه. على سبيل المثال: ^ و $ لها معاني خاصة. إذا كنت ترغب في مطابقة الأحرف "^" و "$" في سلسلة ، فيجب كتابة التعبير باسم "/^" و "/$".
تعبير | مطابق |
/^ | المباراة ^ رمز نفسه |
/$ | تطابق رمز $ نفسه |
/. | تطابق النقطة العشرية (.) نفسها |
تشبه طريقة المطابقة لهذه الأحرف التي هربت "الأحرف العادية". كما أنه يتطابق مع نفس الشخصية.
مثال 1: عندما يكون التعبير "/$ d" ، عند مطابقة السلسلة "ABC $ DE" ، فإن النتيجة المطابقة هي: النجاح ؛ المحتوى المطابق هو: "$ d" ؛ الموقف المطابق هو: ابدأ في الثالثة والنهاية في 5.
1.3 تعبيرات يمكن أن تتطابق مع "أحرف متعددة"
يمكن أن تتطابق بعض طرق التمثيل في التعبيرات العادية إلى أي من "الشخصيات المتعددة". على سبيل المثال ، يمكن أن يتطابق التعبير "/D" إلى أي رقم. على الرغم من أنه يمكن أن يتطابق مع أي حرف فيه ، إلا أنه يمكن أن يكون واحدًا فقط ، وليس مضاعفًا. هذا كما هو الحال عند تشغيل بطاقات البوكر ، يمكن للملوك الكبير والصغير استبدال أي بطاقة ، لكن يمكنهم استبدال بطاقة واحدة فقط.
تعبير | مطابق |
/د | أي رقم ، أي واحد من 0 ~ 9 |
/ث | أي حرف أو رقم أو سطحي ، أي أي واحد من ~ z ، a ~ z ، 0 ~ 9 ، _ |
/ق | أي من أحرف المسافة البيضاء بما في ذلك المساحات ، وعلامات التبويب ، وفواصل الصفحة ، إلخ. |
. | يمكن للنقطة العشرية أن تتطابق مع أي حرف باستثناء حرف NewLine (/N). |
مثال 1: عندما يكون التعبير "/d/d" ، عند مطابقة "ABC123" ، تكون نتيجة المطابقة هي: النجاح ؛ المحتوى المتطابق هو: "12" ؛ الموقف المتطابق هو: ابدأ في الثالثة والنهاية في 5.
مثال 2: عندما يكون التعبير "A./D" ، عند مطابقة "AAA100" ، تكون نتيجة المطابقة هي: النجاح ؛ المحتوى المتطابق هو: "AA1" ؛ الموقف المتطابق هو: ابدأ في 1 وانهى في 4.
1.4 تخصيص التعبيرات التي يمكن أن تتطابق مع "أحرف متعددة"
استخدم أقواس مربعة [] لاحتواء سلسلة من الأحرف التي يمكن أن تطابق أي منها. إذا كنت تستخدم [^] لاحتواء سلسلة من الأحرف ، فيمكنك مطابقة أي حرف آخر غير الأحرف. وعلى نفس المنوال ، على الرغم من أنه يمكن أن يتطابق مع أي واحد منهم ، إلا أنه يمكن أن يكون واحدًا فقط وليس متعدد.
تعبير | مطابق |
[AB5@] | تطابق "A" أو "B" أو "5" أو "@" |
[^ABC] | تطابق أي حرف آخر غير "A" ، "B" ، "C" |
[FK] | تطابق أي حرف بين "f" ~ "k" |
[^A-F0-3] | تطابق أي حرف آخر غير "a" ~ "f" ، "0" ~ "3" |
مثال 1: عندما يكون التعبير "[BCD] [BCD]" تطابق "ABC123" ، فإن نتيجة المطابقة هي: النجاح ؛ المحتوى المتطابق هو: "قبل الميلاد" ؛ الموقف المتطابق هو: ابدأ في 1 وانهى في 3.
مثال 2: عندما يتطابق التعبير "[^ABC]" "ABC123" ، فإن نتيجة المطابقة هي: النجاح ؛ المحتوى المتطابق هو: "1" ؛ الموقف المتطابق هو: ابدأ في الثالثة والنهاية في 4.
1.5 الرموز الخاصة التي تعدل عدد التطابقات
يمكن أن تتطابق التعبيرات المذكورة في الفصل السابق فقط أو أي شخص من الشخصيات المتعددة. إذا كنت تستخدم تعبيرًا بالإضافة إلى رمز خاص يعدل عدد التطابقات ، فيمكنك تكرار المباراة دون كتابة التعبير مرارًا وتكرارًا.
طريقة استخدامه هي: "عدد التعديل" يتم وضعه بعد "التعبير المعدل". على سبيل المثال: "[BCD] [BCD]" يمكن كتابة "[BCD] {2}".
تعبير | تأثير |
{n} | يتم تكرار التعبير n ، على سبيل المثال: "/w {2}" يعادل "/w/w" ؛ "A {5}" يعادل "AAAAA" |
{m ، n} | يتم تكرار التعبير على الأقل م مرات ، وفي معظم الأوقات. على سبيل المثال: "Ba {1،3}" يمكن أن تطابق "BA" أو "Baa" أو "Baaa" |
{م ،} | يتم تكرار التعبير على الأقل م مرات ، على سبيل المثال: "/w/d {2 ،}" يمكن أن يتطابق مع "A12" ، "_ 456" ، "M12344" ... |
؟ | تطابق التعبير 0 أو 1 ، وهو ما يعادل {0،1} ، على سبيل المثال: "A [CD]؟" يمكن أن تطابق "A" ، "AC" ، "AD" |
+ | يظهر التعبير مرة واحدة على الأقل ، وهو ما يعادل {1 ،}. على سبيل المثال: "A+B" يمكن أن تتطابق مع "AB" ، "AAB" ، "AAAB" ... |
* | لا يظهر التعبير أو يحدث في أي وقت ، وهو ما يعادل {0 ،}. على سبيل المثال: "/^*B" يمكن أن تتطابق مع "B" ، "^^^ B" ... |
مثال 1: عندما يتم مطابقة التعبير "/d+/.؟/d*" بـ "يكلف 12.5 دولارًا" ، فإن نتيجة المطابقة هي: ناجحة ؛ المحتوى المتطابق هو: "12.5" ؛ الموقف المتطابق هو: ابدأ في العاشرة وينتهي في 14.
مثال 2: عندما يتم مطابقة تعبير "Go {2،8} GLE" مع "ADS by GooOoogle" ، فإن نتيجة المطابقة هي: النجاح ؛ المحتوى المتطابق هو: "goooooogle" ؛ الموقف المتطابق هو: ابدأ في الساعة 7 وينتهي في 17.
1.6 بعض الرموز الخاصة الأخرى التي تمثل المعنى التجريدي
تمثل بعض الرموز المعنى الخاص للتجريد في التعبيرات:
تعبير | تأثير |
^ | تطابق المكان الذي تبدأ فيه السلسلة ، وليس أي أحرف |
$ | يطابق نهاية السلسلة ، وليس مطابقة أي أحرف |
/ب | تطابق حدود كلمة ، أي الموضع بين الكلمة والمساحة ، ولا يتطابق مع أي أحرف |
لا تزال أوصاف النص الإضافية مجردة نسبيًا ، لذا أعط أمثلة لمساعدة الجميع على فهمها.
مثال 1: عندما يتطابق التعبير "^aaa" "xxx aaa xxx" ، فإن النتيجة المطابقة هي: فشل. نظرًا لأن "^" يتطلب مطابقة المكان الذي تبدأ فيه السلسلة ، "^aaa" يمكن أن يتطابق فقط عندما يكون "AAA" في بداية السلسلة ، على سبيل المثال: "AAA XXX XXX".
مثال 2: عندما يتم مطابقة تعبير "AAA $" مع "XXX AAA XXX" ، فإن النتيجة المطابقة هي: فشل. نظرًا لأن "$" يتطلب مطابقة نهاية السلسلة ، فإن "AAA $" يمكن أن يتطابق فقط عندما يكون "AAA" في نهاية السلسلة ، على سبيل المثال: "XXX XXX AAA".
مثال 3: عند التعبير "./b." يتطابق مع "@abc" ، النتيجة المطابقة هي: ناجحة ؛ المحتوى المطابق هو: "A" ؛ الموقف المطابق هو: ابدأ في 2 وانهى في 4.
مزيد من التفسير: "/B" يشبه "^" و "$" ، والتي لا تتطابق مع أي شخصيات نفسها ، ولكنها تتطلب أن تكون على الجانبين اليسرى واليمين من الموضع في النتيجة المطابقة ، أحد الجانبين هو نطاق "/W" والجانب الآخر هو نطاق غير "/W".
مثال 4: عندما يتطابق التعبير "/bend/b" "عطلة نهاية الأسبوع ، نهاية ، نهاية" ، والنتيجة المطابقة هي: ناجحة ؛ المحتوى المطابق هو: "نهاية" ؛ الموقف المطابق هو: ابدأ في 15 وانهى في 18.
يمكن أن تؤثر بعض الرموز على العلاقة بين التعبيرات الفرعية داخل التعبير:
تعبير | تأثير |
| | العلاقة "أو" بين التعبيرات على الجانبين الأيسر واليمين ، مطابقة الجوانب اليسرى أو اليمنى |
() | (1). عندما يتم تعديل عدد التطابقات ، يمكن تعديل التعبير بين قوسين ككل. (2). عند أخذ النتيجة المطابقة ، يمكن الحصول على المحتوى الذي يتطابق مع التعبير بين قوسين بشكل منفصل |
مثال 5: عندما يطابق تعبير "Tom | Jack" السلسلة "أنا توم ، هو جاك" ، والنتيجة المطابقة هي: ناجحة ؛ المحتوى المطابق هو: "توم" ؛ الموضع المطابق هو: ابدأ في الرابعة والنهاية في الساعة 7. عند مطابقة المواقع التالية ، تكون النتيجة المطابقة هي: ناجحة ؛ المحتوى المطابق هو: "جاك" ؛ عند مطابقة الموقف: يبدأ في 15 وينتهي في 19.
مثال 6: التعبير "(go/s*)+" عند المطابقة "دعنا نذهب اذهب!" ، النتيجة المطابقة هي: ناجحة ؛ المحتوى المطابق هو: "Go Go Go Go" ؛ موقف المطابقة هو: ابدأ في 6 وإنه في 14.
مثال 7: عندما يتم مطابقة تعبير "¥ (/d+/.؟/d*)" بـ "¥ 10.9 ، ¥ 20.5" ، نتيجة المباراة هي: ناجحة ؛ المحتوى المتطابق هو: "¥ 20.5" ؛ الموضع المتطابق هو: ابدأ في السادسة وينتهي في الساعة العاشرة. المحتوى الذي يحصل على نطاق قوسين يتطابق بشكل منفصل هو: "20.5".
2. بعض القواعد المتقدمة في التعبيرات العادية
2.1 الجشع وغير الغريدي في أوقات المباريات
عند استخدام رموز خاصة تعدل عدد التطابقات ، هناك العديد من طرق التمثيل التي تمكن نفس التعبير لمطابقة أوقات مختلفة ، مثل: "{m ، n}" ، "{m ،}" ، "؟" ، "؟" ، "*" ، "+". يعتمد العدد المحدد للمطابقات على سلسلة المطابقة. هذا التعبير مع عدد غير مؤكد من المباريات المتكررة يتطابق دائمًا مع عدة مرات قدر الإمكان أثناء عملية المطابقة. على سبيل المثال ، بالنسبة للنص "dxxxdxxxd" ، فإن ما يلي هو:
تعبير | تطابق النتائج |
(د) (/ث+) | "/W+" سوف يتطابق مع جميع الأحرف بعد أول "D" "XXXDXXXD" |
(د) (/ث+) (د) | سوف يتطابق "/W+" مع جميع الأحرف "XXXDXXX" بين الأول "D" وآخر "D". على الرغم من أن "/W+" يمكن أن يتطابق مع "D" الأخير ، من أجل جعل مطابقة التعبير بأكملها بنجاح ، "/W+" يمكن "الخروج" آخر "d" يمكن أن يتطابق. |
يمكن ملاحظة أنه عندما يتطابق "/W+" ، فإنه يتطابق دائمًا مع العديد من الشخصيات التي تفي بقواعدها قدر الإمكان. على الرغم من أنه في المثال الثاني ، لا يتطابق مع "D" الأخير ، إلا أنه أيضًا يجعل تطابق التعبير بأكمله بنجاح. وبالمثل ، فإن التعبيرات مع "*" و "{m ، n}" تطابق أكبر عدد ممكن ، والتعبيرات مع "؟" هي أيضا "متطابقة" قدر الإمكان عندما تتمكن من مطابقة أو عدم التوافق. ويسمى هذا المبدأ المطابق نمط "الجشع".
وضع غير غريدي:
إضافة "؟"؟ توقيع بعد تعديل الرمز الخاص لعدد المباريات يمكن أن يجعل التعبيرات مع عدد متفاوتة من المباريات المتباريات أقل قدر الإمكان ، بحيث يمكن أن تكون التعبيرات التي يمكن أن تتطابق أو عدم التطابق "متطابقة" قدر الإمكان. يسمى هذا المبدأ المطابق نمط "غير الجريدي" ، والذي يسمى أيضًا نمط "Barb". إذا كان هناك عدد قليل من المباريات ، فسيؤدي ذلك إلى فشل التعبير بأكمله. على غرار وضع الجشع ، سوف يتطابق وضع غير Greedy مع الحد الأدنى لجعل التعبير بأكمله ينجح. على سبيل المثال ، بالنسبة للنص "DXXXDXXXD":
تعبير | تطابق النتائج |
(د) (/ث+؟) | "/ث+؟" سوف تتطابق مع عدد قليل من الشخصيات بعد أول "D" قدر الإمكان ، والنتيجة هي: "/W+؟" فقط يطابق واحد "x" |
(د) (/ث+؟) (د) | لكي يتطابق التعبير بأكمله بنجاح ، "/W+؟" يجب أن تتطابق مع "xxx" لجعل تطابق "D" اللاحق ، بحيث يكون التعبير بأكمله يتطابق بنجاح. إذن النتيجة هي: "/W+؟" تطابق "xxx" |
لمزيد من الحالات ، يرجى الرجوع إلى ما يلي:
مثال 1: عندما يطابق التعبير "<td> (.*) </td>" السلسلة "<td> <p> aa </p> </td> <td> <p> bb </p> </td>" ، النتيجة المطابقة هي: النجاح ؛ المباراة هي "<td> <p> aa </p> </td>" السلسلة بأكملها ، و "</td>" في التعبير سوف يتطابق مع "</td>" في السلسلة.
مثال 2: على النقيض من ذلك ، عندما يتطابق التعبير "<td> (.*؟) </td> عندما تتطابق مع واحد التالي مرة أخرى ، ستحصل على الثانية "<td> <p> bb </p> </td>".
2.2 Backreferences /1 ، /2 ...
عندما يتطابق التعبير ، يسجل محرك التعبير السلسلة التي يتطابق مع التعبير الوارد في القوس "()". عند الحصول على نتيجة مطابقة ، يمكن الحصول على السلسلة التي تتطابق مع التعبير الوارد في الأقواس بشكل منفصل. وقد تم إثبات ذلك عدة مرات في الأمثلة السابقة. في التطبيقات العملية ، عند استخدام حدود معينة للبحث ، ولا يحتوي المحتوى الذي سيتم استرداده على حدود ، يجب استخدام قوسين لتحديد النطاق المطلوب. على سبيل المثال ، السابق "<td> (.*؟) </td>".
في الواقع ، لا يمكن استخدام "السلسلة التي تتطابق مع التعبير الوارد في قوسين" بعد انتهاء المباراة ، ولكن أيضًا أثناء عملية المطابقة. يمكن أن يشير الجزء بعد التعبير إلى "سلسلة المباراة الفرعية التي تمت مطابقتها" بين قوسين. الطريقة المرجعية هي إضافة رقم "/". يشير "/1" إلى السلسلة المتطابقة في الزوج الأول من الأقواس "/2" يشير إلى السلسلة المتطابقة في الزوج الثاني من الأقواس ... وهكذا ، إذا كان زوج واحد من الأقواس يحتوي على زوج آخر من الأقواس ، يتم فرز الأقواس الخارجية أولاً. بمعنى آخر ، إذا كان الزوج يحتوي على الشريحة اليسرى "(" من قبل ، فسيتم فرز الزوج أولاً.
كمثال:
مثال 1: التعبير "('|") (.*؟) (/1) "عند مطابقة" Hello "،" World "" ، نتيجة المباراة هي: النجاح ؛ المحتوى المتطابق هو: "" Hello ".
مثال 2: عند مطابقة التعبير "(/W)/1 {4 ،}" مع "AA BBBB ABCDEFG CCCCC 1111211111 99999999999" ، نتيجة المباراة: ناجحة ؛ المحتوى المتطابق هو "CCCCCC". عندما تتطابق مع واحد التالي مرة أخرى ، ستحصل على 999999999. يتطلب هذا التعبير أحرفًا في النطاق "/W" لتكرارها على الأقل 5 مرات ، مع الاهتمام بالفرق من "/W {5 ،}".
مثال 3: التعبير "<(/w+)/s*(/w+(= ('|").*؟/4)؟/s*)*>. ناجح.
2.3 ما قبل البحث ، عدم التطابق ؛ عكس البحث قبل البحث ، عدم التطابق
في الفصل السابق ، تحدثت عن العديد من الرموز الخاصة التي تمثل معاني مجردة: "^" ، "$" ، "/B". لديهم جميعًا شيء واحد مشترك: إنهم أنفسهم لا يتطابقون مع أي أحرف ، ولكن فقط يرفع شرطًا بـ "طرفيان لسلسلة" أو "شقوق بين الأحرف". بعد فهم هذا المفهوم ، سيستمر هذا القسم في تقديم طريقة تمثيل أكثر مرونة أخرى تضيف شروطًا إلى "طرفين" أو "شقوق".
إلى الأمام قبل البحث: "(؟ = xxxxx)" ، "(؟! xxxxx)"
التنسيق: "(؟ = xxxxx)" ، في السلسلة المطابقة ، الشرط المرفق بـ "الشق" أو "طرفين" هو أن الجانب الأيمن من الفجوة يجب أن يكون قادرًا على مطابقة تعبير جزء XXXXX. نظرًا لأنه مجرد شرط إضافي في هذه الفجوة ، فإنه لا يؤثر على التعبير اللاحق لمطابقة الشخصيات حقًا بعد هذه الفجوة. هذا يشبه "/B" ، والذي لا يتطابق مع أي شخصيات نفسها. "/B" فقط يأخذ الشخصيات قبل وبعد الفجوة ويصدر الحكم ، ولن يؤثر على التعبيرات وراءها لمطابقة حقًا.
مثال 1: عندما يتم مطابقة تعبير "Windows (؟ = NT | XP)" مع "Windows 98 و Windows NT و Windows 2000" ، ولن يتطابق فقط مع "Windows" في "Windows NT" ، وكلمات أخرى "Windows" لن تتم مطابقة.
مثال 2: التعبير "(/w) ((؟ =/1/1/1) (/1))+" عند مطابقة السلسلة "AAA FFFFFF 999999999" ، سيكون قادرًا على مطابقة أول 4 من 6 "F" و 7 من 9 من 9 "9". يمكن قراءة هذا التعبير وتفسيره على النحو التالي: تكرار الرقم الأبجدي الرقمي أكثر من 4 مرات سوف يتطابق مع الجزء قبل آخر رقمين. بالطبع ، لا يمكن كتابة هذا التعبير مثل هذا ، والغرض هنا هو لأغراض التوضيح.
التنسيق: "(؟! xxxxx)" ، يجب ألا يتطابق الجانب الأيمن من الفجوة مع التعبير xxxxx.
مثال 3: التعبير "((؟!/BSTOP/B).)+" عند مطابقة "FDJKA LJFDL STOP FJDSLA FDJ" ، سيتم مطابقتها من البداية إلى الموقف قبل "توقف". إذا لم يكن هناك "توقف" في السلسلة ، فسيتم مطابقة السلسلة بأكملها.
مثال 4: تعبير "do (؟!/w)" يمكن أن يتطابق فقط مع "القيام" عند مطابقة السلسلة "القيام به ، القيام ، الكلب". في هذه المقالة ، فإن تأثير استخدام "do" بعد "(؟!/W)" واستخدام "/B" هو نفسه.
عكسي ما قبل البحث: "(؟ <= xxxxx)" ، "(؟ <! xxxxx)"
مفاهيم هذين التنسيقين تشبه البحث الأمامي إلى الأمام. متطلبات البحث المسبق العكسي هي: "الجانب الأيسر" للفجوة. يتطلب التنسيقان أن يكونا قادرين على المطابقة ويجب ألا يكونوا قادرين على مطابقة التعبير المحدد ، بدلاً من الحكم على الجانب الأيمن. مثل "Forward Pre-Search": كلاهما شرط إضافي للفجوة التي تقع فيها ولا تتطابق مع أي شخصيات نفسها.
مثال 5: التعبير "(؟ <=/d {4})/d+(؟ =/d {4})" عند مطابقة "1234567890123456" ، سيتم مطابقة الأرقام الـ 8 المتوسطة باستثناء الأرقام الأربعة الأولى والأرقام الأربعة الأخيرة. نظرًا لأن jscript.regexp لا يدعم البحث العكسي المسبق ، فلا يمكن إثبات هذه المقالة. يمكن للعديد من المحركات الأخرى أن تدعم البحث العكسي قبل البحث ، مثل: java.util.regex package فوق java 1.4 ، ومساحة اسم System.Text.Text.Regularexpressions في .NET ، وأبسط وأسهل محرك DEELX العادي الموصى به من قبل هذا الموقع.
3. قواعد مشتركة أخرى
هناك أيضًا بعض القواعد الأكثر شيوعًا بين مختلف محركات التعبير العادية ، والتي لم يتم ذكرها في التفسير السابق.
3.1 في التعبيرات ، يمكن استخدام "/xxx" و "/uxxxx" لتمثيل حرف ("X" يعني رقم سداسي عشري)
استمارة | نطاق الأحرف |
/xxx | الأحرف التي لديها أرقام في النطاق من 0 إلى 255 ، مثل: يمكن تمثيل المساحات بـ "/x20" |
/uxxxxx | يمكن تمثيل أي حرف بـ "/u" بالإضافة إلى عدد أرقامها السداسية المكونة من 4 أرقام ، مثل "/medium" |
3.2 بينما تمثل التعبيرات "/s" ، "/d" ، "/w" ، "/B" معاني خاصة ، تمثل الحروف الرأسمالية المقابلة معانيًا معاكسة
تعبير | مطابق |
/ق | تطابق جميع الشخصيات غير المتسايقة (يمكن أن تتطابق مع أحرف المسافة البيضاء الفردية) |
/د | تطابق جميع الشخصيات غير الرقمية |
/ث | تطابق جميع الشخصيات بخلاف الحروف والأرقام والرسومات السفلية |
/ب | تطابق الحدود غير الكلمة ، أي فجوات الشخصية عندما يكون كلا الجانبين "/W" في الجانبين اليسرى واليمين ليست "/W" في الجانبين الأيسر واليمين ليست "/W" |
3.3 هناك معنى خاص في التعبير ، ومن الضروري إضافة "/" لمطابقة ملخص الحرف للشخصية نفسها.
شخصية | يوضح |
^ | يطابق موضع بدء سلسلة الإدخال. لمطابقة الحرف "^" نفسه ، استخدم "/^" |
$ | يطابق الموضع النهائي لسلسلة الإدخال. لمطابقة الشخصية "$" نفسها ، استخدم "/$" |
() | يمثل مواقف البداية والنهاية من التعبير الفرعي. لمطابقة الأقواس ، استخدم "/(" و "/)" |
[] | استخدم تعبيرات مخصصة يمكنها مطابقة "أحرف متعددة". لمطابقة الأقواس ، استخدم "/[" و "/]" |
{} | الرموز التي تعدل عدد المباريات. لمطابقة الأقواس ، استخدم "/{" و "/}" |
. | تطابق أي حرف باستثناء الخط الجديد (/n). لمطابقة النقطة العشرية نفسها ، استخدم "/." |
؟ | عدد تطابقات التعديل هو 0 أو 1. لمطابقة "؟" الشخصية نفسها ، استخدم "/؟" |
+ | عدد مباريات التعديل هو وقت واحد على الأقل. لمطابقة الحرف "+" نفسه ، استخدم "/+" |
* | عدد تطابقات التعديل هو 0 أو أي. لمطابقة الشخصية "*" نفسها ، استخدم "/*" |
| | العلاقة "أو" بين التعبيرات على الجانبين اليسرى واليمين. المباراة "|" نفسها ، يرجى استخدام "/|" |
3.4 التعبير الفرعي بين قوسين "()". إذا كنت تريد أن يتم تسجيل نتيجة مطابقة للاستخدام في المستقبل ، فيمكنك استخدام تنسيق "(؟: xxxxx)
مثال 1: عندما يكون التعبير "(؟: (/W)/1)+" يتطابق "A BBCCDD EFG" ، والنتيجة هي "BBCCDD". يتم استخدام النتيجة المطابقة للقوس "(؟ :)" لا يتم تسجيل النطاق ، لذلك "(/W)" للرجوع إليه.
3.5 مقدمة في إعدادات السمات التعبير شائعة الاستخدام: الجينوريكاس ، Singline ، Multiline ، Global
خصائص التعبير | يوضح |
جينوريكاس | بشكل افتراضي ، فإن الرسائل في التعبيرات حساسة للحالة. تكوين كما يجعل الجينوريكاس حساسا للحالة عند المطابقة. تمد بعض محركات التعبير مفهوم "الحالة" إلى حالة نطاق Unicode. |
سنغلين | بشكل افتراضي ، النقطة العشرية "." يطابق الشخصيات بخلاف فترات الأسطر (/n). قم بتكوينه كـ Singline لجعل النقطة العشرية تتطابق مع جميع الأحرف بما في ذلك فترات الاستراحة. |
متعددة | بشكل افتراضي ، يتطابق التعبيرات "^" و "$" مع البداية ① و end ④ مواضع السلسلة. يحب: ①xxxxxxxx2/n ③xxxxxxxxxx④ قم بتكوين multiline لجعل "^" تطابق ① ، ويمكن أيضًا مطابقة الموضع ③ قبل بدء السطر التالي ، بحيث تتطابق "$" ، ويمكنها أيضًا مطابقة الموضع ② قبل الخط الجديد وينتهي بخط واحد. |
عالمي | إنه يعمل بشكل أساسي عند استخدام التعبيرات لاستبداله ، ويتم تكوينه على أنه Global لاستبدال جميع التطابقات. |
4. نصائح أخرى
4.1 إذا كنت تريد أن تفهم أن المحركات العادية المتقدمة تدعم أيضًا بناء جملة منتظمة معقدة ، فيرجى الرجوع إلى وثائق محرك Deelx العادي على هذا الموقع.
4.2 إذا كنت ترغب في طلب التعبير لمطابقة السلسلة بأكملها ، بدلاً من العثور على جزء من السلسلة ، يمكنك استخدام "^" و "$" في بداية ونهاية التعبير ، على سبيل المثال: "^/d+$" تتطلب أن تكون السلسلة بأكملها فقط أرقام.
4.3 إذا كان المحتوى المطلوب للمطابقة كلمة كاملة وليس جزءًا من الكلمة ، فاستخدم "/B" في بداية ونهاية التعبير ، على سبيل المثال: استخدام "/b WhileLse One OneDovoid On...)/b" لمطابقة الكلمات الرئيسية في البرنامج.
4.4 التعبير لا يتطابق مع سلسلة فارغة. خلاف ذلك ، ستكون المباراة ناجحة طوال الوقت ، ولن يتم مطابقة أي شيء. على سبيل المثال: عندما تستعد لكتابة تعبير يتطابق مع "123" ، "123. ،" 123.5 "،" .5 "، وما إلى ذلك ، يمكن حذف الأعداد الصحيحة ، النقاط العشرية ، والأرقام العشرية ، ولكن لا تكتب التعبير على النحو التالي: طريقة أفضل للكتابة هي: "/d+/.؟/d*|/./d+".
4.5 لا تحلق بلا حدود للمباريات الفرعية التي يمكن أن تتطابق مع السلاسل الفارغة. إذا كان كل جزء من التعبير الفرعي في الأقواس يمكن أن يتطابق مع 0 مرات ، ويمكن أن تتطابق الأقواس ككل من الأوقات اللانهائية ، فقد يكون الموقف أكثر خطورة مما قاله المقال السابق ، وقد تكون عملية المطابقة حلقة ميتة. على الرغم من أن بعض محركات التعبير المنتظمة قد تجنبت الآن الحلقة الميتة في هذه الحالة ، مثل .NET التعبيرات العادية ، لا يزال يتعين علينا محاولة تجنب هذا الموقف. إذا واجهنا حلقة ميتة عند كتابة التعبيرات ، فيمكننا أيضًا البدء من وجهة النظر هذه ومعرفة ما إذا كان هذا هو السبب المذكور في هذه المقالة.
4.6 اختر بشكل معقول وضع الجشع ووضع غير غريدي ، راجع مناقشة الموضوع.
4.7 أو "|" على الجانبين اليسرى واليمين ، من الأفضل مطابقة جانب واحد فقط من شخصية معينة ، بحيث تعبيرات على جانبي "|" لن يختلف بسبب موقف التبادل.
المقالة التالية --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1. تحديد التعبيرات العادية
1) هناك نوعان من التعبيرات العادية ، أحدهما الطريقة العادية والآخر هو طريقة المنشئ.
2) الطريقة العادية: var reg =/تعبير/معلمات إضافية
التعبير: سلسلة تمثل قاعدة معينة ، حيث يمكن استخدام بعض الأحرف الخاصة لتمثيل قواعد خاصة ، والتي سيتم شرحها بالتفصيل لاحقًا.
معلمات إضافية: تستخدم لتوسيع معنى التعبير ، يوجد حاليًا ثلاث معلمات رئيسية:
G: يعني أنه يمكن تنفيذ المطابقة العالمية.
أنا: هذا يعني حالة غير حساسة للحالة.
م: يعني أنه يمكن تنفيذ مطابقة صف متعددة.
يمكن الجمع بين المعلمات الثلاثة أعلاه بشكل تعسفي لتمثيل المعنى المركب ، وبالطبع ، لا توجد معلمات.
مثال:
var reg =/a*b/؛
var reg =/abc+f/g ؛
3) طريقة المنشئ: var reg = regexp جديد ("التعبير" ، "إضافة معلمات") ؛
معنى "التعبير" و "المعلمات الإضافية" هو نفس طريقة التعريف أعلاه.
مثال:
var reg = new regexp ("a*b") ؛
var reg = new regexp ("abc+f" ، "g") ؛
4) الفرق بين الأساليب العادية وأساليب المنشئ
يجب أن يكون التعبير بالطريقة العادية عبارة عن سلسلة ثابتة ، في حين أن التعبير في المُنشئ يمكن أن يكون سلسلة ثابتة أو متغير JS ، مثل معلمة التعبير بناءً على مدخلات المستخدم ، إلخ.:
var reg = new regexp (document.forms [0] .exprfiled.value ، "g") ؛
2. نمط التعبير
1) يشير نمط التعبير إلى طريقة التعبير وأسلوب التعبير ، أي كيفية وصف "التعبير" في var reg =/expression/parameters؟
2) من منظور موحد ، تنقسم أنماط التعبير إلى أنماط بسيطة وأنماط مركبة.
3) نمط بسيط: يشير إلى نمط معبر عنه من خلال مجموعة من الأحرف العادية ، على سبيل المثال
var reg =/abc0d/؛
يمكن ملاحظة أن الأنماط البسيطة يمكن أن تمثل فقط مباريات محددة.
4) نمط المركب: يشير إلى نمط معبر عنه بأحرف البرية ، على سبيل المثال:
var reg =/a+b؟/w/؛
+،؟ و /W كلها شخصيات Wildcard وتمثل معاني خاصة. لذلك ، يمكن للنمط المركب التعبير عن المزيد من المنطق التجريدي.
دعنا نركز على معنى واستخدام كل بطاقة برية في الوضع المركب.
5) شرح الأحرف الخاصة في الوضع المركب:
1>/: يتم استخدامه كشخصية هروب في العديد من لغات البرمجة. بشكل عام
إذا تم اتباع / الرمز بواسطة الحرف العادي C ، فإن / C يمثل معنى خاصًا. على سبيل المثال ، تمثل N في الأصل الحرف n ، ولكن /n يمثل خطًا جديدًا.
إذا تم اتباع / الرمز بحرف خاص C ، فإن / C يمثل الحرف العادي ج. على سبيل المثال ، / يتم استخدامه بشكل عام كحرف هروب ، ولكن يتم استخدام // لضبط الحرف العادي /.
إن استخدام / في التعبير العادي لـ JavaScript هو نفسه أعلاه ، ولكن في لغات البرمجة المختلفة ، قد تكون جداول الأحرف الخاصة مختلفة.
2>^: تطابق بداية سلسلة الإدخال. إذا كانت تطابق متعدد الخطوط ، أي أن المعلمات الإضافية للتعبير تحتوي على M ، فسيتم مطابقة أيضًا بعد خط جديد.
مثال:
/^b/تطابق أول B في "Bab BC"
مثال 2:
/^b/gm مطابقة
"باد ب
CDAF
ب DSFB "
السطر الأول في أول B ، أول B في السطر الثالث
3> $: تطابق نهاية إنشاء حرف الإدخال. إذا كانت تطابق متعدد الخطوط ، أي أن المعلمات الإضافية للتعبير تحتوي على M ، فسيتم مطابقة أيضًا قبل خط جديد.
على عكس استخدام ^.
مثال: / t $ / تطابق T في "BAT" ، ولكن لا يتطابق مع "الكراهية"
مثال 2: /t $ /تطابق
"علامة في
الخفافيش "
آخر ر من السطر الأول و T للخط الثاني.
4>*: تطابق الشخصية السابقة 0 أو أكثر.
مثال: /AB* /تطابق "ABBBB" في "dddabbbc" ، وكذلك مطابقة "A" في "DDDA"
5>+: تطابق الحرف السابق 1 أو أكثر.
مثال: / AB+ / تطابق "ABBBB" في "dddabbbbc" ، ولكن لا يتطابق مع "DDDA"
على غرار استخدام ما يلي {1 ،} (النموذج الأولي: {n ،})
6>؟: استخدام؟ هو مميز جدا. بشكل عام ، يتم استخدامه لمطابقة الشخصية السابقة 0 مرات أو 1 مرة ، ولكن لديها استخدامان خاصان آخران:
إذا تلا ذلك مباشرة *، +،؟ و {} ، فهذا يعني الحد الأدنى لعدد تطابقات المباراة الأصلية ، على سبيل المثال:
/ ba*/ في الأصل "baaaa" في "bbbaaaa" ، ولكن/ ba*؟/ مطابقة "b" في "bbbaaaa" (لأن*يعني 0 أو أكثر من المباريات ، في حين أن زائد؟
وبالمثل: / ba+؟ / تطابق "ba" في "baaaa".
كرمز بنية بناء الجملة ، يتم استخدامه في ما قبل الأساس ، أي ، x (؟ = y) و x (؟! = y) ليتم ذكرها لاحقًا.
7>.: "." تسجيل الدخول في النقطة العشرية يطابق أي حرف واحد ، باستثناء حرف NewLine.
ما هي الشخصيات في المعيار في المجموع؟ يرجى الرجوع إلى: مجموعة الأحرف
على سبيل المثال: / AB / تطابق "ACB" في "ACBAA" ، ولكن لا يتطابق مع "ABBB".
8> (x): يعني مطابقة x (لا تشير بالتحديد إلى الحرف x أو الإشارة على وجه التحديد إلى حرف ، ويمثل x سلسلة) ، وسيتم تذكر المباراة. في بناء الجملة ، يسمى هذا النوع من () "التقاط الآباء" ، أي الأقواس المستخدمة لالتقاطها.
يتم تذكر المباريات لأنه في الوظائف التي يوفرها التعبير ، تُرجع بعض الوظائف صفيفًا يحمل جميع الأوتار المطابقة ، مثل وظيفة exec ().
لاحظ أيضًا أن الفرضية القائلة بأن x in () يتم تذكرها هي مطابقة x.
مثال 1:
var regx =/a (b) c/؛
var rs = regx.exec ("ABCDDD") ؛
كما يتضح من ما سبق ، / a (b) c / Matches "ABC" في "ABCDDD". بسبب () ، سيقوم B أيضًا بتسجيله ، وبالتالي فإن محتوى الرقم الذي تم إرجاعه بواسطة RS هو:
{ABC ، B}
مثال 2:
var regx =/a (b) c/؛
var rs = regx.exec ("ACBCDDD") ؛
RS RESOT NULL ، لأن / a (b) c / لا يتطابق مع "ACBCDDD" ، لذلك لن يتم تسجيل B in () (على الرغم من أن السلسلة تحتوي على B)
9> (؟: X): تطابق X ، ولكن لا تتذكر x. () في هذا التنسيق يسمى "الوالدين غير المشتركين" ، أي قوسين لعدم التغذية.
مثال:
var regx =/a (؟: b) c/؛
var rs = regx.exec ("ABCDDD") ؛
كما يتضح من ما سبق ، / a (؟: b) c / تطابق "ABC" في "ABCDDD" ، بسبب (؟ :) ، لن يتم تسجيل B ، وبالتالي فإن محتوى الرقم الذي تم إرجاعه بواسطة RS هو:
{ABC}
10> x (؟ = y): تطابق x ، فقط إذا تم اتباع y على الفور. إذا تطابق المباراة ، فلن يتم تذكر x فقط ولن يتم تذكر y.
مثال:
var regx =/user (؟ = name)/؛
var rs = regx.exec ("اسم المستخدم هو ماري") ؛
النتيجة: المباراة ناجحة ، وقيمة RS هي {user}
11> x (؟! y): تطابق x ، فقط إذا لم يتم اتباع y على الفور. إذا تطابق المباراة ، فلن يتم تذكر x فقط ولن يتم تذكر y.
مثال:
var regx =/user (؟! name)/؛
var rs = regx.exec ("اسم المستخدم هو ماري") ؛
结果:匹配成功,而且rs的值为{user}
例子2:
var regx=//d+(?!/.)/;
var rs=regx.exec(“54.235”);
Result: The matching result, the value of rs is {5}, and the mismatch is because 54 is followed by the "." لافتة. Of course, 235 also matches, but due to the behavior of the exec method, 235 will not be returned.
12>x|y:匹配x或y。注意如果x和y都匹配上了,那么只记住x。
مثال:
var regx=/beijing|shanghai/;
var rs=regx.exec(“I love beijing and shanghai”);
结果:匹配成功,rs的值为{beijing},虽然shanghai也匹配,但不会被记住。
13>{n}:匹配前一个字符的n次出现。
n必须是一个非负数,当然如果是一个负数或小数也不会报语法错误。
مثال:
var regx=/ab{2}c/;
var rs=regx.exec(“abbcd”);
结果:匹配成功,rs的值为:{abbc}。
14>{n,}:匹配前一个字符的至少n次出现。
مثال:
var regx=/ab{2,}c/;
var rs=regx.exec(“abbcdabbbc”);
结果:匹配成功,rs的值为:{abbc}。注意为什么abbbc也符合条件为什么没有被记住,这与exec方法的行为有关,后面会统一讲解。
15>{n,m}:匹配前一个字符的至少n次最多m次的出现。
只要n与m为数字,而且m>=n就不会报语法错误。
مثال:
var regx=/ab{2,5}c/;
var rs=regx.exec(“abbbcd”);
结果:匹配成功,rs的值为:{abbbc}。
例子2:
var regx=/ab{2,2}c/;
var rs=regx.exec(“abbcd”);
结果:匹配成功,rs的值为:{abbc}。
例子3:
var regx=/ab(2,5)/;
var rs=regx.exec(“abbbbbbbbbb”);
Result: The match is successful, and the value of rs is: {abbbbb}, which means that if the previous character appears more than m times, it will only match m times. فضلاً عن ذلك:
var regx=/ab(2,5)c/;
var rs=regx.exec(“abbbbbbbbbbc”);
结果:匹配失败,rs的值为:null,为什么匹配失败,因为b多于5个则b(2,5)会匹配前5个b,,而表达式/ab(2,5)c/中b后面是c,但字符串中5个b之后还是b所以会报错。
16>[xyz]:xyz表示一个字符串,该模式表示匹配[]中的一个字符,形式上[xyz]等同于[xz]。
مثال:
var regx=/a[bc]d/;
var rs=regx.exec(“abddgg”);
结果:匹配成功,rs的值为:{abd}
例子2:
var regx=/a[bc]d/;
var rs=regx.exec(“abcd”);
结果:匹配失败,rs的值为:null,之所以失败,是因为[bc]表示匹配b或c中的一个,但不会同时匹配。
17>[^xyz]:该模式表示匹配非[]中的一个字符,形式上[^xyz]等同于[^xz]。
مثال:
var regx=/a[^bc]d/;
var rs=regx.exec(“afddgg”);
结果:匹配成功,rs的值为:{afd}
例子2:
var regx=/a[^bc]d/;
var rs=regx.exec(“abd”);
结果:匹配失败,rs的值为:。
18>[/b]:匹配退格键。
19>/b:匹配一个词的边界符,例如空格和换行符等等,当然匹配换行符时,表达式应该附加参数m。
مثال:
var regx=//bc./;
var rs=regx.exec(“Beijing is a beautiful city”);
结果:匹配成功,rs的值为:{ci},注意c前边的空格不会匹配到结果中,即{ ci}是不正确的。
20>/B:代表一个非单词边界。
مثال:
var regx=//Bi./;
var rs=regx.exec(“Beijing is a beautiful city”);
结果:匹配成功,rs的值为:{ij},即匹配了Beijing中的ij。
21>/cX,匹配一个控制字符。例如, /cM 匹配一个Control-M 或
回车符。 x 的值必须为AZ 或az 之一。否则,将c 视为一
个原义的'c' 字符。(实际的例子还需补充)
21>/d:匹配一个数字字符,等同于[0-9]。
مثال:
var regx=/user/d/;
var rs=regx.exec(“user1”);
结果:匹配成功,rs的值为:{user1}
22>/D:匹配一个非数字字符,等同于[^0-9]。
مثال:
var regx=/user/D/;
var rs=regx.exec(“userA”);
结果:匹配成功,rs的值为:{userA}
23>/f:匹配一个换页符。
24>/n:匹配一个换行符。因为是换行符,所以在表达式中要加入m参数。
مثال:
var regx=/a/nbc/m;
var str=“a
قبل الميلاد"؛
var rs=regx.exec(str);
结果:匹配成功,rs的值为:{ },如果表达式为/a/n/rbc/,则不会被匹配,因此在一般的编辑器中一个”Enter”键代表着“回车换行”,而非“换行回车”,至少在textarea域中是这样的。
25>/r:匹配一个回车符
26>/s:匹配一个空格符,等同于[ /f/n/r/t/v/u00A0/u2028/u2029].
مثال:
var regx=//si/;
var rs=regx.exec(“Beijing is a city”);
结果:匹配成功,rs的值为:{ i}
27>/S:匹配一个非空格符,等同于[ ^/f/n/r/t/v/u00A0/u2028/u2029].
مثال:
var regx=//Si/;
var rs=regx.exec(“Beijing is a city”);
结果:匹配成功,rs的值为:{ei}
28>/t:匹配一个tab
مثال:
var regx=/a/tb/;
var rs=regx.exec(“a bc”);
结果:匹配成功,rs的值为: {a bc}
29>/v:匹配一个竖向的tab
30>/w:匹配一个数字、_或字母表字符,即[A-Za-z0-9_ ]。
مثال:
var regx=//w/;
var rs=regx.exec(“$25.23”);
结果:匹配成功,rs的值为:{2}
31>/W:匹配一个非数字、_或字母表字符,即[^A-Za-z0-9_ ]。
مثال:
var regx=//w/;
var rs=regx.exec(“$25.23”);
结果:匹配成功,rs的值为:{$}
32>/n:注意不是/n,这里n是一个正整数,表示匹配第n个()中的字符。
مثال:
var regx=/user([,-])group/1role/;
var rs=regx.exec(“user-group-role”);
结果:匹配成功,rs的值为:{user-group-role,-},同样对user,group,role的匹配也是成功的,但像user-group,role等就不对了。
33>/0:匹配一个NUL字符。
34>/xhh:匹配一个由两位16进制数字所表达的字符。
35>/uhhhh:匹配一个由四位16进制数字所表达的字符。
3,表达式操作
1)表达式操作,在这里是指和表达式相关的方法,我们将介绍六个方法。
2)表达式对象(RegExp)方法:
1>exec(str),返回str中与表达式相匹配的第一个字符串,而且以数组的形式表现,当然如果表达式中含有捕捉用的小括号,则返回的数组中也可能含有()中的匹配字符串,例如:
var regx=//d+/;
var rs=regx.exec(“3432ddf53”);
返回的rs值为:{3432}
var regx2=new RegExp(“ab(/d+)c”);
var rs2=regx2.exec(“ab234c44”);
返回的rs值为:{ab234c,234}
In addition, if there are multiple suitable matches, exec is executed for the first time and exec is continued, the second and third matches are returned in turn. على سبيل المثال:
var regx=/user/d/g;
var rs=regx.exec(“ddduser1dsfuser2dd”);
var rs1=regx.exec(“ddduser1dsfuser2dd”);
则rs的值为{user1},rs的值为{rs2},当然注意regx中的g参数是必须的,否则无论exec执行多少次,都返回第一个匹配。后面还有相关内容涉及到对此想象的解释。
2>test(str), determines whether the string str matches the expression, and returns a boolean value. على سبيل المثال:
var regx=/user/d+/g;
var flag=regx.test(“user12dd”);
flag的值为true。
3)String对象方法
1>match(expr),返回与expr相匹配的一个字符串数组,如果没有加参数g,则返回第一个匹配,加入参数g则返回所有的匹配
مثال:
var regx=/user/d/g;
var str=“user13userddduser345”;
var rs=str.match(regx);
rs的值为:{user1,user3}
2>search(expr),返回字符串中与expr相匹配的第一个匹配的index值。
مثال:
var regx=/user/d/g;
var str=“user13userddduser345”;
var rs=str.search(regx);
rs的值为:0
3>replace(expr,str),将字符串中匹配expr的部分替换为str。另外在replace方法中,str中可以含有一种变量符号$,格式为$n,代表匹配中被记住的第n的匹配字符串(注意小括号可以记忆匹配)。
مثال:
var regx=/user/d/g;
var str=“user13userddduser345”;
var rs=str.replace(regx,”00”);
rs的值为:003userddd0045
例子2:
var regx=/u(se)r/d/g;
var str=“user13userddduser345”;
var rs=str.replace(regx,”$1”);
rs的值为:se3userdddse45
对于replace(expr,str)方法还要特别注意一点,如果expr是一个表达式对象则会进行全局替换(此时表达式必须附加参数g,否则也只是替换第一个匹配),如果expr是一个字符串对象,则只会替换第一个匹配的部分,例如:
var regx=“user”
var str=“user13userddduser345”;
var rs=str.replace(regx,”00”);
rs的值为: 0013userddduser345
4>split(expr),将字符串以匹配expr的部分做分割,返回一个数组,而且表达式是否附加参数g都没有关系,结果是一样的。
مثال:
var regx=/user/d/g;
var str=“user13userddduser345”;
var rs=str.split(regx);
rs的值为:{3userddd,45}
4,表达式相关属性
1)表达式相关属性,是指和表达式相关的属性,如下面的形式:
var regx=/myexpr/;
var rs=regx.exec(str);
其中,和表达式自身regx相关的属性有两个,和表达式匹配结果rs相关的属性有三个,下面将逐一介绍。
2)和表达式自身相关的两个属性:
1>lastIndex,返回开始下一个匹配的位置,注意必须是全局匹配(表达式中带有g参数)时,lastIndex才会有不断返回下一个匹配值,否则该值为总是返回第一个下一个匹配位置,例如:
var regx=/user/d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var lastIndex1=regx.lastIndex;
rs=regx.exec(“sdsfuser1dfsfuser2”);
var lastIndex2=regx.lastIndex;
rs=regx.exec(“sdsfuser1dfsfuser2”);
var lastIndex3=regx.lastIndex;
上面lastIndex1为9,第二个lastIndex2也为9,第三个也是9;如果regx=/user/d/g,则第一个为9,第二个为18,第三个为0。
2>source, return the expression string itself. على سبيل المثال:
var regx=/user/d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var source=regx.source;
source的值为user/d
3)和匹配结果相关的三个属性:
1>index, return the current matching position. على سبيل المثال:
var regx=/user/d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var index1=rs.index;
rs=regx.exec(“sdsfuser1dfsfuser2”);
var index2=rs.index;
rs=regx.exec(“sdsfuser1dfsfuser2”);
var index3=rs.index;
index1为4,index2为4,index3为4,如果表达式加入参数g,则index1为4,index2为13,index3会报错(index为空或不是对象)。
2>input, used for matching strings. على سبيل المثال:
var regx=/user/d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var input=rs.input;
input的值为sdsfuser1dfsfuser2。
3>[0],返回匹配结果中的第一个匹配值,对于match而言可能返回一个多值的数字,则除了[0]外,还可以取[1]、[2]等等。例如:
var regx=/user/d/;
var rs=regx.exec(“sdsfuser1dfsfuser2”);
var value1=rs[0];
rs=regx.exec(“sdsfuser1dfsfuser2”);
var value2=rs[0];
value1的值为user1,value2的值为user2
5,实际应用
1)实际应用一
描述:有一表单,其中有一个“用户名”input域
要求:汉字,而且不能少于2个汉字,不能多于4个汉字。
ينجز:
<script>function checkForm(obj){ var username=obj.username.value; var regx=/^[/u4e00-/u9fa5]{2,4}$/g if(!regx.test(username)){ alert(“Invalid username!”); return false; } return true;}</script><form name=“myForm”onSubmit=“return checkForm(this)”> <input type=“text” name=“username”/> <input type=“submit” vlaue=“submit”/></form>2)实际应用二
描述:给定一个含有html标记的字符串,要求将其中的html标记去掉。
ينجز:
<script>function toPlainText(htmlStr){ var regx=/<[^>]*>|<//[^>]*>/gm; var str=htmlStr.replace(regx,""); return str;}</script><form name=“myForm”> <textarea id=“htmlInput”></textarea> <input type=“button” value=“submit” onclick=“toPlainText(document.getElementById('htmlInput').value”/></form>三,小结
1,Javascript正则表达式,我想在一般的程序员之中,使用者应该不是很多,因为我们处理的页面一般都不是很复杂,而复杂的逻辑一般我们都在后台处理完成了。但是目前趋势已经出现了扭转,富客户端已经被越来越多的人接受,而Javascript就是其中的关键技术,对于复杂的客户端逻辑而言,正则表达式的作用也是很关键的,同时它也是Javascript高手必须要掌握的重要技术之一。
2,为了能够便于大家对前面讲述的内容有一个更为综合和深刻的认识,我将前面的一些关键点和容易犯糊涂的地方再系统总结一下,这部分很关键!
总结1:附件参数g的用法
表达式加上参数g之后,表明可以进行全局匹配,注意这里“可以”的含义。我们详细叙述:
1) For the exec method of the expression object, if g is not added, it will only return the first match, no matter how many times it is executed, if g is added, the first execution will also return the first match, and then the execution will return the second match, and so on. على سبيل المثال
var regx=/user/d/;
var str=“user18dsdfuser2dsfsd”;
var rs=regx.exec(str);//此时rs的值为{user1}
var rs2=regx.exec(str);//此时rs的值依然为{user1}
如果regx=/user/d/g;则rs的值为{user1},rs2的值为{user2}
通过这个例子说明:对于exec方法,表达式加入了g,并不是说执行exec方法就可以返回所有的匹配,而是说加入了g之后,我可以通过某种方式得到所有的匹配,这里的“方式”对于exec而言,就是依次执行这个方法即可。
2)对于表达式对象的test方法,加入g于不加上g没有什么区别。
3) For the match method of the String object, g is not added, and it only returns the first match. If the match method is executed all the time, it always returns the first match. If g is added, then all matches will be returned at once (note that this is different from the exec method of the expression object. For exec, even if g is added, all matches will not be returned at once). على سبيل المثال:
var regx=/user/d/;
var str=“user1sdfsffuser2dfsdf”;
var rs=str.match(regx);//此时rs的值为{user1}
var rs2=str.match(regx);//此时rs的值依然为{user1}
如果regx=/user/d/g,则rs的值为{user1,user2},rs2的值也为{user1,user2}
4)对于String对象的replace方法,表达式不加入g,则只替换第一个匹配,如果加入g,则替换所有匹配。(开头的三道测试题能很好的说明这一点)
5)对于String对象的split方法,加上g与不加g是一样的,即:
var sep=/user/d/;
var array=“user1dfsfuser2dfsf”.split(sep);
则array的值为{dfsf, dfsf}
此时sep=/user/d/g,返回值是一样的。
6)对于String对象的search方法,加不加g也是一样的。
总结2:附加参数m的用法
附加参数m,表明可以进行多行匹配,但是这个只有当使用^和$模式时才会起作用,在其他的模式中,加不加入m都可以进行多行匹配(其实说多行的字符串也是一个普通字符串),我们举例说明这一点
1)使用^的例子
var regx=/^b./g;var str=“bd76 dfsdf sdfsdfs dffs b76dsf sdfsdf”;var rs=str.match(regx);
此时加入g和不加入g,都只返回第一个匹配{bd},如果regx=/^b./gm,则返回所有的匹配{bd,b7},注意如果regx=/^b./m,则也只返回第一个匹配。所以,加入m表明可以进行多行匹配,加入g表明可以进行全局匹配,综合到一起就是可以进行多行全局匹配
2)使用其他模式的例子,例如
var regx=/user/d/;var str=“sdfsfsdfsdf sdfsuser3 dffs b76dsf user6”;var rs=str.match(regx);
此时不加参数g,则返回{user3},加入参数g返回{user3,user6},加不加入m对此没有影响。
3)因此对于m我们要清楚它的使用,记住它只对^和$模式起作用,在这两种模式中,m的作用为:如果不加入m,则只能在第一行进行匹配,如果加入m则可以在所有的行进行匹配。我们再看一个^的例子
var regx=/^b./;var str=“ret76 dfsdf bjfsdfs dffs b76dsf sdfsdf”;var rs=str.match(regx);
此时rs的值为null,如果加入g,rs的值仍然为null,如果加入m,则rs的值为{bj}(也就是说,在第一行没有找到匹配,因为有参数m,所以可以继续去下面的行去找是否有匹配),如果m和g都加上,则返回{bj,b7}(只加m不加g说明,可以去多行进行匹配,但是找到一个匹配后就返回,加入g表明将多行中所有的匹配返回,当然对于match方法是如此,对于exec呢,则需要执行多次才能依次返回)
总结3:
在HTML的textarea输入域中,按一个Enter键,对应的控制字符为“/r/n”,即“回车换行”,而不是“/n/r”,即“换行回车”,我们看一个前面我们举过的例子:
var regx=/a/r/nbc/;var str=“a bc”;var rs=regx.exec(str);
结果:匹配成功,rs的值为:{ },如果表达式为/a/n/rbc/,则不会被匹配,因此在一般的编辑器中一个”Enter”键代表着“回车换行”,而非“换行回车”,至少在textarea域中是这样的。
The above article briefly discusses the use of RegExp objects and brackets for JS regular expressions is all the content I share with you. آمل أن يعطيك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.