regex - ريجكس: هل كسول أسوأ؟




regex-greedy non-greedy (4)

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

لقد كتبت دائما ريجكسيس مثل هذا

<A HREF="([^"]*)" TARGET="_blank">([^<]*)</A>

ولكن تعلمت للتو عن هذا الشيء كسول ، ويمكنني أن أكتب ذلك من هذا القبيل

<A HREF="(.*?)" TARGET="_blank">(.*?)</A>

هل هناك أي عيب في استخدام هذا النهج الثاني؟ التعبير العادي هو بالتأكيد أكثر إحكاما (حتى سو يوزعه على نحو أفضل).

تحرير : هناك اثنين من أفضل الإجابات هنا، والتي تشير إلى اثنين من الاختلافات الهامة بين التعبيرات. جواب يسث يشير إلى ضعف في غير الجشع / كسول واحد، حيث الارتباط التشعبي نفسه يمكن أن تشمل سمات أخرى من علامة A (بالتأكيد ليست جيدة). روب كينيدي يشير إلى ضعف في المثال الجشع، في تلك النصوص مرساة لا يمكن أن تشمل علامات أخرى (بالتأكيد ليس بخير، لأنه لن انتزاع كل نص مرساة إما) ... وبالتالي فإن الجواب هو أن التعبيرات العادية يجري ما هم هي، والحلول كسول وغير كسول التي تبدو هي نفسها على الأرجح لا يعادل نظريا.

تحرير : ثالث أفضل إجابة هو آلان M حول السرعة النسبية للتعابير. في الوقت الحاضر، وأنا علامة له أفضل إجابة حتى الناس يعطيه المزيد من النقاط :)


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


لاحظ أن الأمثلة الخاصة بك ليست مكافئة. لن يحدد التعبير العادي الأول أي روابط تحتوي على علامات أخرى، مثل img أو b . التعبير العادي الثاني سوف، وأتوقع هذا ربما ما تريد على أي حال.

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


فئة الطابع تكمل أكثر بدقة ما تريد أن تتطابق، لذلك كلما كان ذلك ممكنا، وكنت استخدامها.

سوف التعبير العادي غير الجشع تطابق الأشياء التي ربما لا تريد، مثل:

<A HREF="foo" NAME="foo" TARGET="_blank">foo</A>

حيث أول الخاص بك. *؟ اعواد الكبريت

foo" NAME="foo




reluctant-quantifiers